มีการเปิดตัวโครงการใหม่ในช่วงสองวันที่ผ่านมาเนื่องจากสมาชิกของทีมโครงการใช้ mybatis เสมอ แม้ว่าโดยส่วนตัวแล้วฉันชอบแบบจำลองมินิมัลลิสต์ของ JPA แต่ MyBatis ก็ยังคงมุ่งมั่นที่จะรักษาการเลือกเทคโนโลยีแบบครบวงจรเพื่อรักษาโครงการ ฉันออนไลน์เพื่อค้นหาข้อมูลที่เกี่ยวข้องเกี่ยวกับการรวมกันของ Spring Boot และ MyBatis มีรูปแบบต่าง ๆ ซึ่งทำให้คนเบื่อที่จะอ่านมัน เมื่อรวมการสาธิตและเอกสารอย่างเป็นทางการของ MyBatis ในที่สุดฉันก็พบโหมดที่ง่ายที่สุดสองโหมด ฉันใช้เวลาหนึ่งวันในการสรุปและแบ่งปัน
สาระสำคัญของเฟรมเวิร์ก ORM คือการทำให้การเข้ารหัสฐานข้อมูลการทำงานง่ายขึ้นในการเขียนโปรแกรม ตอนนี้มีสอง บริษัท ที่เหลืออยู่ หนึ่งคือการอ้างว่าคุณไม่สามารถเขียนประโยคของ SQL Hibernate และอีกประโยคหนึ่งคือการดีบัก mybatis ของ SQL แบบไดนามิกที่ยืดหยุ่นได้อย่างยืดหยุ่น ทั้งสองมีลักษณะของตัวเองและสามารถใช้ได้อย่างยืดหยุ่นตามความต้องการในการพัฒนาระบบระดับองค์กร ฉันพบปรากฏการณ์ที่น่าสนใจ: บริษัท ดั้งเดิมส่วนใหญ่ชอบใช้ไฮเบอร์เนตและอุตสาหกรรมอินเทอร์เน็ตมักจะใช้ mybatis
ลักษณะของไฮเบอร์เนตคือ SQL ทั้งหมดถูกสร้างขึ้นโดยใช้รหัส Java และไม่จำเป็นต้องเขียน SQL (อ่าน) โดยไม่ต้องกระโดดออกจากโปรแกรม มันมีความสมบูรณ์ของการเขียนโปรแกรม มันพัฒนาขึ้นไปด้านบนของโมเดล โดยทั่วไป SQL ที่สอดคล้องกันสามารถสร้างขึ้นตามชื่อวิธี หากคุณไม่ทราบมากนักคุณสามารถอ่านบทความก่อนหน้าของฉันเกี่ยวกับการใช้งาน Spring Data JPA
MyBatis มีปัญหามากในระยะแรกซึ่งต้องการไฟล์การกำหนดค่าต่างๆคลาสเอนทิตีการเชื่อมโยงการทำแผนที่เลเยอร์ DAO และการกำหนดค่าอื่น ๆ อีกมากมาย แน่นอน MyBatis ยังค้นพบข้อเสียนี้ ในระยะแรกเครื่องกำเนิดไฟฟ้าได้รับการพัฒนาซึ่งสามารถสร้างคลาสเอนทิตีไฟล์การกำหนดค่าและรหัสเลเยอร์ DAO โดยอัตโนมัติตามผลลัพธ์ของตารางซึ่งสามารถลดส่วนหนึ่งของปริมาณการพัฒนา ในระยะต่อมาสามารถใช้การเพิ่มประสิทธิภาพจำนวนมากเพื่อใช้คำอธิบายประกอบจัดการเลเยอร์ DAO และไฟล์การกำหนดค่าโดยอัตโนมัติและการพัฒนาไปด้านบนคือโมเดลที่เราจะพูดถึงในวันนี้ MyBatis-Spring-Boot-Starter คือ Springboot+MyBatis สามารถเพิ่มความคิดเห็นได้อย่างสมบูรณ์โดยไม่ต้องมีไฟล์การกำหนดค่าและยังสามารถกำหนดค่าได้ง่ายและเริ่มต้นได้ง่าย
ตอนนี้คิดเกี่ยวกับมันสปริงบูตนั้นยอดเยี่ยมมาก ตราบใดที่คุณเชื่อมโยงอะไรกับสปริงบูตมันจะทำให้มันง่ายขึ้น
MyBatis-Spring-Boot-Starter
คำอธิบายอย่างเป็นทางการ: MyBatis Spring-Boot-Starter จะช่วยให้คุณใช้ mybatis กับ Spring Boot
ในความเป็นจริง MyBatis ได้พัฒนาวิธีแก้ปัญหาในการเข้าร่วมในความสนุกเนื่องจากการบูตฤดูใบไม้ผลิเป็นที่นิยม แต่อันนี้ได้แก้ไขปัญหามากมายและมีความเรียบง่ายกว่าที่จะใช้ มีวิธีแก้ปัญหาหลักสองประการสำหรับ mybatis-spring-boot-starter หนึ่งคือการใช้คำอธิบายประกอบเพื่อแก้ปัญหาทั้งหมดและอื่น ๆ เป็นประเพณีเก่าที่เรียบง่าย
แน่นอนโหมดใด ๆ ต้องแนะนำไฟล์ POM ของ MyBatis-Spring-Boot-Starter ก่อน ตอนนี้เวอร์ชันล่าสุดคือ 1.1.1 (มันเพิ่งเกิดขึ้นกับ Double 11 :))
<การพึ่งพา> <roupId> org.mybatis.spring.boot </groupid> <ratifactid> mybatis-spring-boot-starter </artifactid>
ฉันจะแนะนำสองรุ่นการพัฒนา
ไม่มีเวอร์ชันคำอธิบายประกอบไฟล์กำหนดค่า
มันทำด้วยคำอธิบายประกอบ
1 เพิ่มไฟล์ maven ที่เกี่ยวข้อง
<การพึ่งพา> <การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter </artifactid> </การพึ่งพาอาศัย> <การพึ่งพา> <roupId> org.springframework.boot </groupid> > Spring-Boot-Starter-test </artifactId> <scope> ทดสอบ </cope> </การพึ่งพาอาศัย> <การพึ่งพา> <GroupId> org.springframework.boot </roupid> dency> <roupId> org.mybatis.spring.boot </groupId> <ratifactid> mybatis-spring-boot-starter </artifactid> <cersion> 1.1.1 </Side> </การพึ่งพา> onnector-java </artifactid> </dercendency> <การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-devtools </artifactid>
ฉันจะไม่โพสต์แพ็คเกจ POM ที่สมบูรณ์ที่นี่โปรดอ่านซอร์สโค้ดโดยตรง
2. Application.properties เพิ่มการกำหนดค่าที่เกี่ยวข้อง
myBatis.type-aliases-package = com.neo.entityspring.datasource.driverclassName = com.mysql.jdbc.driverspring.datasource.url = jdbc: mysql: // localhost: 3306/test1 Rootspring.datasource.password = root
Springboot จะโหลดการกำหนดค่าที่เกี่ยวข้องของ Spring.datasource โดยอัตโนมัติ*และแหล่งข้อมูลจะถูกฉีดลงใน SQLSessionFactory โดยอัตโนมัติ SQLSessionFactory จะถูกฉีดเข้าไปใน Mapper โดยอัตโนมัติ โดยวิธีการที่คุณไม่ต้องกังวลเกี่ยวกับทุกสิ่งเพียงแค่หยิบมันขึ้นมาและใช้มัน
เพิ่มการสแกนแพ็คเกจ Mapper ในคลาสเริ่มต้น @MapperScan
@springbootapplication@mapperscan ("com.neo.mapper") แอปพลิเคชันคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (application.class, args);}}}หรือเพียงเพิ่มคำอธิบายประกอบ @Mapper ในคลาส Mapper ขอแนะนำให้ใช้ข้างต้นมิฉะนั้นจะค่อนข้างลำบากในการเพิ่มคำอธิบายประกอบให้กับ MAPPER แต่ละตัว
3. พัฒนา Mapper
ขั้นตอนที่สามเป็นส่วนที่สำคัญที่สุดและการผลิต SQL อยู่ที่นี่
อินเทอร์เฟซสาธารณะ usermapper {@select ("เลือก * จากผู้ใช้")@results ({@result (property = "usesex", คอลัมน์ = "user_sex", javatype = usersexenum.class),@result = "ชื่อเล่น", คอลัมน์ = "nick_name")}) #{id} ")@results ({@result (property =" usensex ", คอลัมน์ =" user_sex ", javatype = usensExenum.class),@result (คุณสมบัติ =" ชื่อเล่น ", คอลัมน์ =" nick_name ")}) userentity getone #{รหัสผ่าน},#{usensex}) ") void แทรก (ผู้ใช้ผู้ใช้);@update (" ผู้ใช้อัปเดตตั้งค่าชื่อผู้ใช้ =#{ชื่อผู้ใช้}, nick_name =#{ชื่อเล่น} โดยที่ id =#{id} "เพื่อให้ใกล้ชิดกับการผลิตมากขึ้นฉันขีดเส้นใต้สองแอตทริบิวต์ของ user_sex และ nick_name ในฐานข้อมูลและชื่อแอตทริบิวต์คลาสเอนทิตีไม่สอดคล้องกัน นอกจากนี้ user_sex ใช้การแจกแจง
@Select เป็นคำอธิบายประกอบของคลาสการสืบค้นและการสืบค้นทั้งหมดใช้สิ่งนี้
@Result แก้ไขชุดผลลัพธ์ที่ส่งคืนและแอตทริบิวต์คลาสเอนทิตีที่เกี่ยวข้องและฟิลด์ฐานข้อมูลสอดคล้องกันทีละหนึ่ง หากแอตทริบิวต์คลาสเอนทิตีและชื่อแอตทริบิวต์ฐานข้อมูลมีความสอดคล้องกันแอตทริบิวต์นี้ไม่จำเป็นต้องแก้ไข
@INSERT แทรกฐานข้อมูลที่จะใช้โดยตรงผ่านคลาสเอนทิตีจะแยกวิเคราะห์แอตทริบิวต์เป็นค่าที่สอดคล้องกันโดยอัตโนมัติ
@update มีหน้าที่แก้ไขและสามารถส่งผ่านไปยังวัตถุโดยตรง
@Delete รับผิดชอบในการลบ
สำหรับคุณสมบัติเพิ่มเติมโปรดดูที่นี่: http://www.mybatis.org/mybatis-3/zh/java-api.html
โปรดทราบว่าความแตกต่างระหว่างการใช้ # Symbol และ $ Symbol:
// ตัวอย่างนี้สร้างคำสั่งที่เตรียมไว้บางอย่างเช่น Select * จากครูที่ชื่อ =?;@select ("เลือก * จากครูที่ชื่อ = #{ชื่อ}") ครู selectTeachForGivenName (@param ("ชื่อ") ชื่อสตริง); // ตัวอย่างนี้สร้างชื่อ n จากครู SelectTeachForGivenName (@Param ("ชื่อ") ชื่อสตริง);4. ใช้
สามขั้นตอนข้างต้นโดยทั่วไปเสร็จสิ้นการพัฒนาเลเยอร์ที่เกี่ยวข้อง เมื่อใช้งานเพียงแค่ใช้เป็นคลาสธรรมดาและสามารถฉีดเข้าไปในนั้นได้
@runwith (SpringRunner.class) @springboottestpublic Class USERMApperTest {@autowiredPrivate USERMAPPER USERMAPPER; @TestPublic Void TestInsert () โยนข้อยกเว้น {USERMAPPER.INSERT (ผู้ใช้ใหม่ ("AA" ผู้ใช้งาน ("BB", "B123456", userSexenum.woman)); usermapper.insert (ผู้ใช้ใหม่ ("CC", "B123456", usersexenum.woman); assert.assertequals (3, usermapper.getall () users = usermapper.getall (); system.out.println (users.toString ());}@testpublic เป็นโมฆะ testupdate () โยนข้อยกเว้น {userentity user = usermapper.getone (3L); System.out.println (user.toString ()); user.setNickName ("neo"); usermapper.update (ผู้ใช้); assert.asserttrue (("neo" .equals (usermapper.getone (3l)มีการเพิ่มเติมการลบการแก้ไขและการค้นหาในซอร์สโค้ดอย่างสมบูรณ์ดังนั้นฉันจะไม่โพสต์ไว้ที่นี่
รุ่น XML มินิมอล
รุ่น XML มินิมัลลิสต์รักษาประเพณีเก่า ๆ ของการแมปไฟล์ การเพิ่มประสิทธิภาพส่วนใหญ่สะท้อนให้เห็นในเลเยอร์การใช้งานที่ไม่จำเป็นต้องใช้ ระบบจะค้นหา SQL ที่เกี่ยวข้องโดยอัตโนมัติในไฟล์การแมปตามชื่อวิธี
1. การกำหนดค่า
ไฟล์ POM เหมือนกับเวอร์ชันก่อนหน้ายกเว้นว่าการกำหนดค่าต่อไปนี้จะถูกเพิ่มลงใน application.properties
mybatis.config-locations = classpath: mybatis/mybatis-config.xmlmybatis.mapper-locations = classpath: mybatis/mapper/*. xml
ระบุที่อยู่ของไฟล์การกำหนดค่าพื้นฐาน MyBatis และไฟล์การแมปคลาสเอนทิตี
การกำหนดค่า mybatis-config.xml
<การกำหนดค่า> <PypeAliases> <typealias alias = "จำนวนเต็ม" type = "java.lang.integer" /> <typealias alias = "long" type = "java.lang.long" /> <typealias alias = "hashmap" type = type = "java.util.linkedhashmap" /> <typealias alias = "arraylist" type = "java.util.arraylist" /> <typealias alias = "linkedList" type = "java.util.linkedList" />
ที่นี่คุณสามารถเพิ่มการกำหนดค่า mybatis พื้นฐานบางอย่าง
2. เพิ่มไฟล์การแมปของผู้ใช้
<mapper namespace = "com.neo.mapper.usermapper"> <resultmap id = "baseresultmap" type = "com.neo.entity.userentity"> <id column = "id" คุณสมบัติ = "id" jdbctype = "bigint" คุณสมบัติ = "รหัสผ่าน" jdbcType = "varchar" /> <result column = "user_sex" คุณสมบัติ = "usesex" javatype = "com.neo.enums.usersexenum" /> <result column = "nick_name" รหัสผ่าน, user_sex, nick_name </sql> <select id = "getall" resultmap = "baseresultmap"> เลือก <รวม refid = "base_column_list"/> จากผู้ใช้ </select> <select id = "getone" parameterType = "java.lang /> จาก userswhere id = #{id} </select> <แทรก id = "แทรก" parameterType = "com.neo.entity.userentity"> แทรกลงในผู้ใช้ (ชื่อผู้ใช้รหัสผ่าน user_sex) parameterType = "com.neo.entity.userentity"> อัปเดตผู้ใช้ตั้งค่า <ถ้า test = "username! = null"> username = #{ชื่อผู้ใช้}, </if> <ถ้า test = "รหัสผ่าน! parameterType = "java.lang.long"> ลบ fromusers โดยที่ id = #{id} </delete> </mapper>อันที่จริงมันเพิ่งย้าย Mapper SQL จากเวอร์ชันก่อนหน้าไปยัง XML ที่นี่
3. เขียนรหัสเลเยอร์ Dao
อินเทอร์เฟซสาธารณะ usermapper {list <userentity> getAll (); ผู้ใช้ getone (Long ID); void insert (ผู้ใช้ผู้ใช้); การอัปเดตเป็นโมฆะ (ผู้ใช้ผู้ใช้); เป็นโมฆะลบ (Long ID);}เมื่อเทียบกับขั้นตอนก่อนหน้ามีวิธีการอินเทอร์เฟซเท่านั้น
4. ใช้
ไม่มีความแตกต่างระหว่างการใช้และเวอร์ชันก่อนหน้าโปรดดูที่รหัส
วิธีการเลือก
ทั้งสองโหมดมีลักษณะของตัวเอง เวอร์ชันที่มีคำอธิบายประกอบเหมาะสำหรับโหมดง่ายและรวดเร็ว ในความเป็นจริงเช่นโมเดล Microservice ยอดนิยมในปัจจุบัน Microservice จะสอดคล้องกับฐานข้อมูลของตัวเอง ความต้องการแบบสอบถามการเชื่อมต่อแบบหลายตารางจะลดลงอย่างมากและจะเหมาะสำหรับโหมดนี้มากขึ้นเรื่อย ๆ
โมเดลดั้งเดิมแบบเก่าเหมาะสำหรับโครงการขนาดใหญ่ มันสามารถสร้าง SQL ได้อย่างยืดหยุ่นซึ่งสะดวกสำหรับการปรับ SQL และยังมีความรู้สึกในการเขียน SQL ด้วยความยินดีและเพรียวบาง
รหัสตัวอย่าง-GitHub: https://github.com/ityouknow/spring-boot-examples
ตัวอย่างรหัส-รหัสคลาวด์: https://gitee.com/ityouknow/spring-boot-examples