ตามคำแถลงอย่างเป็นทางการ งานพัฒนาของ Spring3 เสร็จสมบูรณ์ก่อนการถือกำเนิดของ ibatis3 ซึ่งก็คือ Mybatis3 ดังนั้นจึงยังไม่มีการสนับสนุนสำหรับ Mybatis3 ใน Spring3 ดังนั้นชุมชน Mybatis จึงพัฒนา Mybatis-Spring ขึ้นมาเองเพื่อตอบสนองความต้องการของผู้ใช้ Mybatis ในการบูรณาการ Spring ต่อไปนี้จะให้ข้อมูลเบื้องต้นโดยย่อเกี่ยวกับการใช้งานการผสานรวม Mybatis และ Spring ผ่าน Mybatis-Spring
MapperFactoryBean
ขั้นแรก เราต้องดาวน์โหลดแพ็คเกจ Mybatis-Spring jar จากเว็บไซต์อย่างเป็นทางการของ Mybatis และเพิ่มลงในคลาสพาธของโปรเจ็กต์ของเรา แน่นอนว่า เรายังต้องเพิ่มแพ็คเกจ jar ที่เกี่ยวข้องของ Mybatis และแพ็คเกจ jar ที่เกี่ยวข้องของ Spring ด้วย เรารู้ว่าการดำเนินการทั้งหมดใน Mybatis ขึ้นอยู่กับ SqlSession และ SqlSession ถูกสร้างขึ้นโดย SqlSessionFactory และ SqlSessionFactory ถูกสร้างขึ้นโดย SqlSessionFactoryBuilder แต่ Mybatis-Spring นั้นใช้ SqlSessionFactoryBean เมื่อใช้ Mybatis-Spring เราจำเป็นต้องมี SqlSession ด้วย และ SqlSession นี้ฝังอยู่ในโปรแกรม และโดยทั่วไปไม่ต้องการให้เราเข้าถึงโดยตรง SqlSession ยังถูกสร้างขึ้นโดย SqlSessionFactory แต่ Mybatis-Spring จะห่อหุ้ม SqlSessionFactoryBean สำหรับเรา ใน bean นี้ เรายังคงใช้ SqlSessionFactoryBuilder เพื่อสร้าง SqlSessionFactory ที่สอดคล้องกัน จากนั้นรับ SqlSession ที่สอดคล้องกัน ด้วย SqlSessionFactoryBean เราสามารถให้ข้อมูลการกำหนดค่าบางอย่างของ Mybatis ได้โดยการระบุคุณสมบัติบางอย่างในนั้น ต่อไปเราจำเป็นต้องกำหนด SqlSessionFactoryBean ในไฟล์การกำหนดค่า applicationContext ของ Spring
รหัส XML
<bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml" / > <ชื่อคุณสมบัติ="typeAliasesPackage" value="com.tiantian.ckeditor.model" /> </bean>
เมื่อกำหนด SqlSessionFactoryBean จะต้องระบุแอตทริบิวต์ dataSource ซึ่งแสดงถึงแหล่งข้อมูลที่ใช้เชื่อมต่อกับฐานข้อมูล แน่นอนว่าเรายังสามารถระบุคุณลักษณะอื่นๆ ได้ด้วย ต่อไปนี้คือตัวอย่างบางส่วน:
mapperLocations: ระบุตำแหน่งที่เก็บไฟล์ Mapper ของเรา เมื่อไฟล์ Mapper ของเราอยู่ในตำแหน่งเดียวกับอินเทอร์เฟซ Mapper ที่เกี่ยวข้อง ไม่จำเป็นต้องระบุค่าของแอตทริบิวต์นี้
configLocation: ใช้เพื่อระบุตำแหน่งไฟล์การกำหนดค่าของ Mybatis หากระบุแอตทริบิวต์นี้ SqlSessionFactoryBuilder ที่เกี่ยวข้องจะถูกสร้างขึ้นโดยใช้เนื้อหาของไฟล์การกำหนดค่าเป็นข้อมูลการกำหนดค่า แต่เนื้อหาที่ระบุโดยแอตทริบิวต์ที่ตามมาจะเขียนทับเนื้อหาที่เกี่ยวข้องซึ่งระบุไว้ในไฟล์การกำหนดค่า
typeAliasesPackage: โดยทั่วไปจะสอดคล้องกับแพ็คเกจที่คลาสเอนทิตีของเราตั้งอยู่ ในขณะนี้ ชื่อคลาสแบบง่ายในแพ็คเกจที่เกี่ยวข้องซึ่งไม่รวมชื่อแพ็คเกจจะถูกใช้เป็นนามแฝงรวมถึงชื่อแพ็คเกจโดยอัตโนมัติ แพ็กเกจหลายรายการสามารถคั่นด้วยเครื่องหมายจุลภาคหรืออัฒภาค
typeAliases: ประเภทอาร์เรย์ที่ใช้ในการระบุนามแฝง หลังจากระบุแอตทริบิวต์นี้แล้ว Mybatis จะใช้ชื่อย่อของประเภทนี้เป็นนามแฝงของประเภทนี้ โดยมีเงื่อนไขว่าคำอธิบายประกอบ @Alias ไม่ได้ถูกทำเครื่องหมายบนคลาส มิฉะนั้น ค่าที่สอดคล้องกับคำอธิบายประกอบจะถูกใช้เป็นนามแฝงของ ประเภทนี้
รหัส XML
<property name="typeAliases"> <array> <value>com.tiantian.mybatis.model.Blog</value> <value>com.tiantian.mybatis.model.Comment</value> </array> </property >
ปลั๊กอิน: ประเภทอาร์เรย์ ใช้เพื่อระบุ Interceptor ของ Mybatis
typeHandlersPackage: ใช้เพื่อระบุแพ็คเกจที่มี TypeHandler อยู่ หากมีการระบุแอตทริบิวต์นี้ SqlSessionFactoryBean จะลงทะเบียนคลาสภายใต้แพ็คเกจเป็น TypeHandler ที่เกี่ยวข้องโดยอัตโนมัติ แพ็กเกจหลายรายการสามารถคั่นด้วยเครื่องหมายจุลภาคหรืออัฒภาค
typeHandlers: ประเภทอาร์เรย์ แทน TypeHandler
ขั้นตอนต่อไปคือการกำหนด MapperFactoryBean ที่สอดคล้องกับวัตถุ Mapper ที่เราต้องการในไฟล์ applicationContext ของ Spring วัตถุ Mapper ที่เราต้องการสามารถรับได้จาก MapperFactoryBean MapperFactoryBean ใช้อินเทอร์เฟซ FactoryBean ของ Spring ดังนั้น MapperFactoryBean จึงได้รับวัตถุ Mapper ที่สอดคล้องกันผ่านวิธี getObject ที่กำหนดไว้ในอินเทอร์เฟซ FactoryBean เมื่อกำหนด MapperFactoryBean มีคุณสมบัติสองประการที่เราจำเป็นต้องฉีด คุณสมบัติแรกคือ sqlSessionFactory ที่ Mybatis-Spring ใช้เพื่อสร้างวัตถุ SqlSessionTemplate ที่ใช้อินเทอร์เฟซ SqlSession อีกอย่างคืออินเทอร์เฟซ Mapper ที่สอดคล้องกันที่เราต้องการส่งคืน
หลังจากกำหนด MapperFactoryBean ที่สอดคล้องกับอินเทอร์เฟซ Mapper ที่สอดคล้องกันแล้ว เราสามารถแทรกอินเทอร์เฟซ Mapper ที่สอดคล้องกันของเราลงในวัตถุ bean ที่จัดการโดย Spring เช่น วัตถุ Service bean ด้วยวิธีนี้ เมื่อเราจำเป็นต้องใช้อินเทอร์เฟซ Mapper ที่สอดคล้องกัน MapperFactoryBean จะได้รับอินเทอร์เฟซ Mapper ที่สอดคล้องกันจากวิธี getObject และ getObject ภายในยังคงเรียกใช้วิธี getMapper (อินเทอร์เฟซ Mapper) ของอินเทอร์เฟซ SqlSession ผ่านคุณสมบัติที่เราฉีดเพื่อส่งคืน อินเทอร์เฟซ Mapper ที่สอดคล้องกัน ด้วยวิธีนี้ การรวม Mybatis และ Spring ทำได้โดยการมอบ SqlSessionFactory และอินเทอร์เฟซ Mapper ที่เกี่ยวข้องให้กับการจัดการ Spring
ไฟล์คอนฟิกูเรชัน applicationContext.xml ของ Spring:
รหัส XML
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc = "http://www.springframework.org/schema/mvc" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans /spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring- mvc-3.0.xsd"> <context:component-scan base-package="com.tiantian.mybatis"/> <context:property-placeholder location="classpath:config/jdbc.properties"/> <bean id="dataSource" destroy-method="close"> <ชื่อคุณสมบัติ="driverClassName" value="${jdbc.driver}" /> <ชื่อคุณสมบัติ ="url" value="${jdbc.url}" /> <ชื่อคุณสมบัติ="ชื่อผู้ใช้" value="${jdbc.username}" /> <ชื่อคุณสมบัติ="รหัสผ่าน" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <ชื่อคุณสมบัติ="mapperLocations" value="classpath: com/tiantian/mybatis/mapper/*.xml"/> <ชื่อคุณสมบัติ="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean id="blogMapper"> <property name="mapperInterface" value="com.tiantian.mybatis.mapper.BlogMapper" /> <ชื่อคุณสมบัติ="sqlSessionFactory" ref="sqlSessionFactory" /> </ ถั่ว> ถั่ว> </ถั่ว>
ไฟล์ BlogMapper.xml:
รหัส XML
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis -3-mapper.dtd"> <mapper namespace="com.tiantian.mybatis.mapper.BlogMapper"> <!-- เพิ่มบันทึกใหม่--> <insert id="insertBlog" parameterType="Blog" useGeneratedKeys="true" keyProperty="id"> แทรกลงในค่า t_blog(title,content,owner) (#{title},#{content},#{owner}) </ insert> <!-- สืบค้นบันทึกเดียว--> <select id="selectBlog" parameterType="int" resultMap="BlogResult"> เลือก * จาก t_blog โดยที่ id = #{id} </select> <!-- แก้ไขบันทึก--> <update id="updateBlog" parameterType="Blog"> อัปเดต t_blog set title = #{title},content = #{content},owner = #{owner} โดยที่ id = #{id} </update> <!-- ค้นหาบันทึกทั้งหมด--> <select id="selectAll" resultType="Blog"> เลือก * จาก t_blog </select> <!-- ลบบันทึก--> <delete id="deleteBlog" parameterType="int"> ลบออกจาก t_blog โดยที่ id = #{id} </delete> </mapper>
BlogMapper.java:
รหัสจาวา
แพ็คเกจ com.tiantian.mybatis.mapper; import java.util.List; import com.tiantian.mybatis.model.Blog; publicinterface BlogMapper { บล็อกสาธารณะ selectBlog(int id); ); publicvoid DeleteBlog(int id);
BlogServiceImpl.java:
รหัสจาวา
แพ็คเกจ com.tiantian.mybatis.service.impl; นำเข้า java.util.List; นำเข้า javax.annotation.Resource; นำเข้า org.springframework.stereotype.Service; mybatis.model.Blog; นำเข้า com.tiantian.mybatis.service.BlogService; @Service publicclass BlogServiceImpl ใช้ BlogService { private BlogMapper blogMapper; publicvoid DeleteBlog(int id) { blogMapper.deleteBlog(id); } ค้นหาบล็อกสาธารณะ(int id) { returnblogMapper.selectBlog(id); } รายการสาธารณะ<Blog> find() { returnblogMapper.selectAll( } publicvoid insertBlog (บล็อกบล็อก) { blogMapper.insertBlog (บล็อก); } publicvoid updateBlog (บล็อกบล็อก) { blogMapper.updateBlog(blog); } สาธารณะ BlogMapper getBlogMapper() { returnblogMapper; } @Resource publicvoid setBlogMapper(BlogMapper blogMapper) { this.blogMapper = blogMapper;
MapperScannerConfigurer
เมื่อใช้วิธีการข้างต้นในการบูรณาการ หากเรามี Mapper เราจำเป็นต้องกำหนด MapperFactoryBean ที่สอดคล้องกัน เมื่อเรามี Mapper ค่อนข้างน้อย ก็ไม่เป็นไร แต่เมื่อเรามี Mapper ค่อนข้างมาก เราจะกำหนด Mapper แต่ละตัวเช่นนี้ MapperFactoryBean ที่เกี่ยวข้องดูเหมือนจะช้าลง เพื่อจุดประสงค์นี้ Mybatis-Spring ได้จัดเตรียมคลาสที่เรียกว่า MapperScannerConfigurer ให้กับเรา ผ่านคลาสนี้ Mybatis-Spring จะลงทะเบียนวัตถุ MapperFactoryBean ให้กับเราโดยอัตโนมัติ
หากเราจำเป็นต้องใช้ MapperScannerConfigurer เพื่อช่วยเราสแกนและลงทะเบียนอินเทอร์เฟซ Mapper โดยอัตโนมัติ เราจำเป็นต้องกำหนด bean ที่สอดคล้องกับ MapperScannerConfigurer ในไฟล์การกำหนดค่า applicationContext ของ Spring สำหรับ MapperScannerConfigurer มีแอตทริบิวต์หนึ่งรายการที่เราต้องระบุ นั่นคือ basePackage basePackage ใช้เพื่อระบุแพ็คเกจพื้นฐานที่มีไฟล์อินเทอร์เฟซ Mapper อยู่ อินเทอร์เฟซ Mapper ภายใต้แพ็คเกจพื้นฐานนี้หรือแพ็คเกจย่อยทั้งหมดจะถูกค้นหา แพ็กเกจพื้นฐานหลายรายการสามารถคั่นด้วยเครื่องหมายจุลภาคหรืออัฒภาค คำจำกัดความ MapperScannerConfigurer ที่ง่ายที่สุดคือการระบุแอตทริบิวต์ basePackage เพียงรายการเดียวเท่านั้น เช่น:
รหัส XML
<bean> <ชื่อคุณสมบัติ="basePackage" value="com.tiantian.mybatis.mapper" /> </bean>
ด้วยวิธีนี้ MapperScannerConfigurer จะสแกนอินเทอร์เฟซทั้งหมดภายใต้แพ็คเกจพื้นฐานที่ระบุ และลงทะเบียนเป็นวัตถุ MapperFactoryBean เมื่อใช้ MapperScannerConfigurer และเพิ่มแอตทริบิวต์ basePackage ไฟล์การกำหนดค่า applicationContext ในตัวอย่างด้านบนจะเป็นดังนี้:
รหัส XML
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc = "http://www.springframework.org/schema/mvc" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans /spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring- mvc-3.0.xsd"> <context:component-scan base-package="com.tiantian.mybatis" /> <context:property-placeholder location="classpath:config/jdbc.properties" /> <bean id="dataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <ชื่อคุณสมบัติ ="url" value="${jdbc.url}" /> <ชื่อคุณสมบัติ="ชื่อผู้ใช้" value="${jdbc.username}" /> <ชื่อคุณสมบัติ="รหัสผ่าน" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <ชื่อคุณสมบัติ="mapperLocations" value="classpath: com/tiantian/mybatis/mapper/*.xml" /> <ชื่อคุณสมบัติ="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean> <ชื่อคุณสมบัติ="basePackage" value="com.tiantian.mybatis.mapper" /> </bean> </beans>
บางครั้งแพ็คเกจพื้นฐานที่เราระบุไม่ใช่อินเทอร์เฟซ Mapper ทั้งหมดที่เรากำหนด ด้วยเหตุนี้ MapperScannerConfigurer จึงให้คุณสมบัติอื่นอีกสองรายการแก่เราซึ่งสามารถจำกัดขอบเขตการค้นหาและการลงทะเบียนให้แคบลง อันหนึ่งคือ annotationClass และอีกอันคือ markerInterface
annotationClass: เมื่อระบุ annotationClass แล้ว MapperScannerConfigurer จะลงทะเบียนเฉพาะอินเทอร์เฟซที่ทำเครื่องหมายด้วยคำอธิบายประกอบ annotationClass เท่านั้น
markerInterface: markerInterface ใช้เพื่อระบุอินเทอร์เฟซ เมื่อระบุ markerInterface MapperScannerConfigurer จะลงทะเบียนอินเทอร์เฟซที่สืบทอดมาจาก markerInterface เท่านั้น
หากมีการระบุคุณสมบัติทั้งสองข้างต้น MapperScannerConfigurer จะใช้การรวมเข้าด้วยกันแทนการแยกกัน แม้ว่าจะใช้ annotationClass สำหรับการทำเครื่องหมายหรืออินเทอร์เฟซที่สืบทอดมาจาก markerInterface จะถูกลงทะเบียนเป็น MapperFactoryBean
ตอนนี้สมมติว่าอินเทอร์เฟซ Mapper ของเราสืบทอดอินเทอร์เฟซ SuperMapper จากนั้นเราสามารถกำหนด MapperScannerConfigurer ของเราเช่นนี้
รหัส XML
<bean> <ชื่อคุณสมบัติ="basePackage" value="com.tiantian.mybatis.mapper" /> <ชื่อคุณสมบัติ="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/> </bean>
หากใช้แท็กคำอธิบายประกอบ MybatisMapper เราสามารถกำหนด MapperScannerConfigurer ของเราได้เช่นนี้
รหัส XML
<bean> <ชื่อคุณสมบัติ="basePackage" value="com.tiantian.mybatis.mapper" /> <ชื่อคุณสมบัติ="annotationClass" value="com.tiantian.mybatis.annotation.MybatisMapper"/> </bean>
นอกจากคุณสมบัติที่ใช้ในการจำกัดขอบเขตของอินเทอร์เฟซ Mapper ที่ลงทะเบียนแล้ว เรายังสามารถระบุคุณสมบัติอื่นๆ บางอย่างได้ เช่น:
sqlSessionFactory: คุณสมบัตินี้เลิกใช้แล้ว เมื่อเราใช้แหล่งข้อมูลหลายแหล่ง เราจำเป็นต้องใช้ sqlSessionFactory เพื่อระบุ SqlSessionFactory ที่จำเป็นต้องใช้เมื่อลงทะเบียน MapperFactoryBean เนื่องจากเมื่อไม่ได้ระบุ sqlSessionFactory แหล่งข้อมูลหนึ่งจะถูกแทรกโดยอัตโนมัติในลักษณะ Autowired กล่าวอีกนัยหนึ่ง เมื่อเราใช้แหล่งข้อมูลเพียงแห่งเดียว นั่นคือเมื่อเรากำหนด SqlSessionFactory เพียงแห่งเดียว เราไม่จำเป็นต้องระบุ SqlSessionFactory สำหรับ MapperScannerConfigurer
sqlSessionFactoryBeanName: ฟังก์ชันจะเหมือนกับ sqlSessionFactory ยกเว้นว่าจะระบุชื่อ bean ที่สอดคล้องกับ SqlSessionFactory ที่กำหนดไว้
sqlSessionTemplate: คุณลักษณะนี้เลิกใช้แล้ว ฟังก์ชั่นของมันยังเทียบเท่ากับ sqlSessionFactory เพราะดังที่ได้กล่าวไว้ก่อนหน้านี้ MapperFactoryBean ท้ายที่สุดก็ใช้วิธีการ getMapper ของ SqlSession เพื่อรับวัตถุ Mapper ที่สอดคล้องกัน จำเป็นต้องระบุเมื่อมีการกำหนด SqlSessionTemplates หลายรายการเท่านั้น สำหรับ MapperFactoryBean ต้องใช้ SqlSessionFactory และ SqlSessionTemplate เพียงอันเดียวเท่านั้น เมื่อระบุทั้งสองอย่างแล้ว SqlSessionFactory จะถูกละเว้น
sqlSessionTemplateBeanName: ระบุชื่อ bean ที่สอดคล้องกับ sqlSessionTemplate ที่จะใช้
หมายเหตุ: เนื่องจากการใช้แอตทริบิวต์ sqlSessionFactory และ sqlSessionTemplate จะทำให้เนื้อหาบางส่วนถูกโหลดก่อน PropertyPlaceholderConfigurer ข้อมูลคุณสมบัติภายนอกที่ใช้ในไฟล์การกำหนดค่าจะไม่สามารถถูกแทนที่ได้ทันเวลาและข้อผิดพลาดจะเกิดขึ้น ดังนั้น ข้อมูลใหม่อย่างเป็นทางการ คุณสมบัติ sqlSessionFactory และ sqlSessionTemplate ถูกยกเลิกใน Mybatis-Spring ขอแนะนำให้คุณใช้คุณสมบัติ sqlSessionFactoryBeanName และคุณสมบัติ sqlSessionTemplateBeanName
รหัส XML
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc = "http://www.springframework.org/schema/mvc" xmlns: mybatis = "http://www.mybatis.org/schema/mybatis" xsi:schemaLocation = "http://www.springframework .org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.mybatis.org/schema/mybatis http:/ /www.mybatis.org/schema/mybatis/mybatis-spring.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <context:component-scan base-package="com.tiantian.mybatis" /> <context:property-placeholder location= "classpath:config/jdbc.properties" /> <bean id="dataSource" destroy-method="close"> <ชื่อคุณสมบัติ="driverClassName" ค่า="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <ชื่อคุณสมบัติ="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/tiantian/mybatis/mapper/*.xml" /> <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean> <ชื่อคุณสมบัติ="basePackage" value="com.tiantian.mybatis.mapper" /> <ชื่อคุณสมบัติ="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/> <ชื่อคุณสมบัติ="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>
เทมเพลต SqlSession
นอกเหนือจากการใช้อินเทอร์เฟซ Mapper โดยตรงหลังจากการรวมระบบข้างต้นแล้ว Mybatis-Spring ยังมอบวิธีใช้ SqlSession โดยตรงให้กับเราอีกด้วย Mybatis-Spring จัดเตรียมคลาส SqlSessionTemplate ที่ใช้อินเทอร์เฟซ SqlSession ให้กับเรา มีความปลอดภัยสำหรับเธรดและ Dao หลายตัวสามารถใช้ได้ในเวลาเดียวกัน ในเวลาเดียวกัน ยังเชื่อมโยงกับธุรกรรมของ Spring เพื่อให้แน่ใจว่า SqlSession ที่ใช้อยู่ในปัจจุบันเป็นธุรกรรมที่ถูกผูกไว้กับธุรกรรมของ Spring และยังสามารถจัดการการส่งและปิด Session ได้ด้วยตัวเอง เมื่อใช้กลไกการจัดการธุรกรรมของ Spring SqlSession ก็สามารถส่งและย้อนกลับพร้อมกับธุรกรรมของ Spring ได้
เมื่อใช้ SqlSessionTemplate เราสามารถกำหนดได้ในไฟล์การกำหนดค่า applicationContext ของ Spring ดังนี้:
<bean id="sqlSession"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean>
ด้วยวิธีนี้ เราสามารถใช้ SqlSessionTemplate โดยตรงในการเขียนโปรแกรมใน Dao ผ่านการ dependency insert ของ Spring ในเวลานี้ Dao ของเราอาจมีลักษณะดังนี้:
รหัสจาวา
แพ็คเกจ com.tiantian.mybatis.dao; นำเข้า java.util.List; นำเข้า javax.annotation.Resource; นำเข้า org.mybatis.spring.SqlSessionTemplate; นำเข้า org.springframework.stereotype.Repository; Blog; @Repository publicclass BlogDaoImpl ใช้งาน BlogDao { private SqlSessionTemplate sqlSessionTemplate; publicvoid DeleteBlog(int id) { sqlSessionTemplate.delete("com.tiantian.mybatis.mapper.BlogMapper.deleteBlog", id); } ค้นหาบล็อกสาธารณะ (int id) { returnsqlSessionTemplate.selectOne("com.tiantian.mybatis. mapper.BlogMapper.selectBlog", id); } รายการสาธารณะ<Blog> find() { returnthis.sqlSessionTemplate.selectList("com.tiantian.mybatis.mapper.BlogMapper.selectAll"); } publicvoid insertBlog(บล็อกบล็อก) { this.sqlSessionTemplate.insert("com.tiantian. mybatis.mapper.BlogMapper.insertBlog", บล็อก); } publicvoid updateBlog(บล็อกบล็อก) { this.sqlSessionTemplate.update("com.tiantian.mybatis.mapper.BlogMapper.updateBlog", บล็อก); } SqlSessionTemplate สาธารณะ getSqlSessionTemplate() { returnsqlSessionTemplate; } @Resource publicvoid setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate; } }
บันทึก:
บทความนี้เขียนขึ้นจาก Mybatis3.2.1, Mybatis-Spring1.1.0 และ Spring3.1
ข้างต้นเป็นการวิเคราะห์โดยย่อเกี่ยวกับกระบวนการดำเนินการของการรวม mybatis และสปริงที่แนะนำในบทความนี้ ฉันหวังว่าคุณจะชอบมัน บทความถัดไปจะแนะนำวิธีการรวมของ spring และ mybatis ให้กับคุณ