Menurut keterangan resminya, pekerjaan pengembangan Spring3 telah selesai sebelum munculnya ibatis3, yaitu Mybatis3, sehingga masih belum ada dukungan untuk Mybatis3 di Spring3. Oleh karena itu, komunitas Mybatis mengembangkan Mybatis-Spring sendiri untuk memenuhi kebutuhan pengguna Mybatis dalam mengintegrasikan Spring. Berikut ini akan diberikan pengenalan singkat tentang penggunaan integrasi Mybatis dan Spring melalui Mybatis-Spring.
MapperFactoryBean
Pertama, kita perlu mengunduh paket jar Mybatis-Spring dari situs resmi Mybatis dan menambahkannya ke jalur kelas proyek kita. Tentu saja, kita juga perlu menambahkan paket jar terkait Mybatis dan paket jar terkait Spring. Kita tahu bahwa semua operasi di Mybatis didasarkan pada SqlSession, dan SqlSession dihasilkan oleh SqlSessionFactory, dan SqlSessionFactory dihasilkan oleh SqlSessionFactoryBuilder. Tapi Mybatis-Spring didasarkan pada SqlSessionFactoryBean. Saat menggunakan Mybatis-Spring, kita juga memerlukan SqlSession, dan SqlSession ini tertanam di dalam program dan umumnya tidak mengharuskan kita mengaksesnya secara langsung. SqlSession juga dihasilkan oleh SqlSessionFactory, tetapi Mybatis-Spring merangkum SqlSessionFactoryBean untuk kita. Dalam kacang ini, kita masih menggunakan SqlSessionFactoryBuilder untuk membuat SqlSessionFactory yang sesuai, dan kemudian mendapatkan SqlSessionFactory yang sesuai. Melalui SqlSessionFactoryBean kami dapat memberikan beberapa informasi konfigurasi Mybatis dengan menentukan beberapa properti di dalamnya. Jadi selanjutnya kita perlu mendefinisikan SqlSessionFactoryBean di file konfigurasi applicationContext Spring.
kode XML
<bean id="sqlSessionFactory"> <nama properti="dataSource" ref="dataSource" /> <nama properti="mapperLocations" value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml" / > <nama properti="typeAliasesPackage" value="com.tiantian.ckeditor.model" /> </bean>
Saat mendefinisikan SqlSessionFactoryBean, atribut dataSource harus ditentukan, yang mewakili sumber data yang digunakan untuk menyambung ke database. Tentu saja, kami juga dapat menentukan beberapa atribut lainnya.
mapperLocations: Ini menunjukkan lokasi penyimpanan file Mapper kita. Ketika file Mapper kita berada di lokasi yang sama dengan antarmuka Mapper yang sesuai, tidak perlu menentukan nilai atribut ini.
configLocation: digunakan untuk menentukan lokasi file konfigurasi Mybatis. Jika atribut ini ditentukan, SqlSessionFactoryBuilder yang sesuai akan dibuat menggunakan konten file konfigurasi sebagai informasi konfigurasi, namun konten yang ditentukan oleh atribut berikutnya akan menimpa konten terkait yang ditentukan dalam file konfigurasi.
typeAliasesPackage: Biasanya sesuai dengan paket tempat kelas entitas kita berada. Saat ini, nama kelas sederhana dalam paket terkait yang tidak menyertakan nama paket akan secara otomatis diambil sebagai alias termasuk nama paket. Beberapa paket dapat dipisahkan dengan koma atau titik koma.
typeAliases: tipe array, digunakan untuk menentukan alias. Setelah menentukan atribut ini, Mybatis akan menggunakan nama pendek dari tipe ini sebagai alias dari tipe ini, asalkan anotasi @Alias tidak ditandai pada kelas, jika tidak, nilai yang sesuai dengan anotasi tersebut akan digunakan sebagai alias dari tipe ini.
kode XML
<property name="typeAliases"> <array> <value>com.tiantian.mybatis.model.Blog</value> <value>com.tiantian.mybatis.model.Comment</value> </array> </property >
plugin: tipe array, digunakan untuk menentukan Interceptor Mybatis.
typeHandlersPackage: digunakan untuk menentukan paket tempat TypeHandler berada. Jika atribut ini ditentukan, SqlSessionFactoryBean akan secara otomatis mendaftarkan kelas di bawah paket tersebut sebagai TypeHandler yang sesuai. Beberapa paket dapat dipisahkan dengan koma atau titik koma.
typeHandlers: Tipe array, mewakili TypeHandler.
Langkah selanjutnya adalah mendefinisikan MapperFactoryBean yang sesuai dengan objek Mapper yang kita inginkan di file applicationContext Spring. Objek Mapper yang kita inginkan bisa didapatkan melalui MapperFactoryBean. MapperFactoryBean mengimplementasikan antarmuka FactoryBean Spring, sehingga MapperFactoryBean memperoleh objek Mapper yang sesuai melalui metode getObject yang ditentukan dalam antarmuka FactoryBean. Saat mendefinisikan MapperFactoryBean, ada dua properti yang perlu kita masukkan. Salah satunya adalah sqlSessionFactory yang digunakan oleh Mybatis-Spring untuk menghasilkan objek SqlSessionTemplate yang mengimplementasikan antarmuka SqlSession;
Setelah mendefinisikan MapperFactoryBean yang sesuai dengan antarmuka Mapper yang sesuai, kita dapat memasukkan antarmuka Mapper yang sesuai ke dalam objek bean yang dikelola oleh Spring, seperti objek Service bean. Dengan cara ini, ketika kita perlu menggunakan antarmuka Mapper yang sesuai, MapperFactoryBean akan mendapatkan antarmuka Mapper yang sesuai dari metode getObject-nya, dan secara internal getObject masih memanggil metode getMapper (antarmuka Mapper) dari antarmuka SqlSession melalui properti yang kami masukkan untuk mengembalikan antarmuka Pemeta yang sesuai. Dengan cara ini, integrasi Mybatis dan Spring dicapai dengan menyerahkan SqlSessionFactory dan antarmuka Mapper yang sesuai ke manajemen Spring.
File konfigurasi applicationContext.xml Spring:
kode XML
<?xml version="1.0" coding="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"> <nama properti="driverClassName" value="${jdbc.driver}" /> <nama properti ="url" value="${jdbc.url}" /> <nama properti="nama pengguna" value="${jdbc.username}" /> <nama properti="kata sandi" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <nama properti="dataSource" ref="dataSource" /> <nama properti="mapperLocations" value="classpath: com/tiantian/mybatis/mapper/*.xml"/> <nama properti="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean id="blogMapper"> <nama properti="mapperInterface" value="com.tiantian.mybatis.mapper.BlogMapper" /> <nama properti="sqlSessionFactory" ref="sqlSessionFactory" /> </ kacang> kacang> </kacang>
File BlogMapper.xml:
kode XML
<?xml version="1.0" coding="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"> <!-- Tambahkan catatan baru--> <masukkan id="insertBlog" parameterType="Blog" useGeneratedKeys="true" keyProperty="id"> masukkan ke dalam nilai t_blog(title,content,owner)(#{title},#{content},#{owner}) </ insert> <!-- Kueri satu catatan--> <select id="selectBlog" parameterType="int" resultMap="BlogResult"> pilih * dari t_blog di mana id = #{id} </select> <!-- Ubah catatan--> <update id="updateBlog" parameterType="Blog"> perbarui t_blog setel judul = #{title},content = #{content},owner = #{owner} di mana id = #{id} </update> <!-- Kueri semua catatan--> <select id="selectAll" resultType="Blog"> pilih * dari t_blog </select> <!-- Hapus catatan--> <delete id="deleteBlog" parameterType="int"> hapus dari t_blog di mana id = #{id} </delete> </mapper>
BlogMapper.java:
kode Jawa
paket com.tiantian.mybatis.mapper; import java.util.List; import com.tiantian.mybatis.model.Blog; publicinterface BlogMapper { public Blog selectBlog(int id insertBlog(Blog blog); ); publicvoid deleteBlog(int id); Daftar publik<Blog> pilihSemua();
BlogServiceImpl.java:
kode Jawa
paket com.tiantian.mybatis.service.impl; impor java.util.List; impor javax.annotation.Resource; impor org.springframework.stereotype.Service; mybatis.model.Blog; import com.tiantian.mybatis.service.BlogService; @Service publicclass BlogServiceImpl mengimplementasikan BlogService { pribadi BlogMapper blogMapper; publicvoid deleteBlog(int id) { blogMapper.deleteBlog(id); } public Blog find(int id) { returnblogMapper.selectBlog(id); publicvoid insertBlog(Blog blog) { blogMapper.insertBlog(blog } publicvoid updateBlog(Blog blog) { blogMapper.updateBlog(blog); } BlogMapper publik getBlogMapper() { returnblogMapper } @Resource publicvoid setBlogMapper(BlogMapper blogMapper) { this.blogMapper = blogMapper;
MapperScannerConfigurer
Saat menggunakan metode integrasi di atas, jika kita memiliki Mapper, kita perlu mendefinisikan MapperFactoryBean yang sesuai. Jika kita memiliki Mapper yang relatif sedikit, ini tidak masalah, tetapi jika kita memiliki Mapper yang cukup banyak, kita mendefinisikan setiap Mapper seperti ini. MapperFactoryBean yang sesuai tampaknya lebih lambat. Untuk tujuan ini, Mybatis-Spring memberi kita kelas bernama MapperScannerConfigurer. Melalui kelas ini, Mybatis-Spring akan secara otomatis mendaftarkan objek MapperFactoryBean yang sesuai dengan Mapper untuk kita.
Jika kita perlu menggunakan MapperScannerConfigurer untuk membantu kita secara otomatis memindai dan mendaftarkan antarmuka Mapper, kita perlu mendefinisikan kacang yang sesuai dengan MapperScannerConfigurer di file konfigurasi applicationContext Spring. Untuk MapperScannerConfigurer, ada satu atribut yang harus kita tentukan, yaitu basePackage. basePackage digunakan untuk menentukan paket dasar tempat file antarmuka Mapper berada. Antarmuka Mapper di bawah paket dasar ini atau semua sub-paketnya akan dicari. Beberapa paket dasar dapat dipisahkan dengan koma atau titik koma. Definisi MapperScannerConfigurer yang paling sederhana adalah dengan menentukan hanya satu atribut basePackage, seperti:
kode XML
<bean> <nama properti="basePackage" value="com.tiantian.mybatis.mapper" /> </bean>
Dengan cara ini, MapperScannerConfigurer akan memindai semua antarmuka di bawah paket dasar yang ditentukan dan mendaftarkannya sebagai objek MapperFactoryBean. Saat menggunakan MapperScannerConfigurer dan menambahkan atribut basePackage, file konfigurasi applicationContext pada contoh kita di atas akan menjadi seperti ini:
kode XML
<?xml version="1.0" coding="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"> <nama properti="driverClassName" value="${jdbc.driver}" /> <nama properti ="url" value="${jdbc.url}" /> <nama properti="nama pengguna" value="${jdbc.username}" /> <nama properti="kata sandi" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <nama properti="dataSource" ref="dataSource" /> <nama properti="mapperLocations" value="classpath: com/tiantian/mybatis/mapper/*.xml" /> <nama properti="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean> <nama properti="basePackage" value="com.tiantian.mybatis.mapper" /> </bean> </beans>
Terkadang paket dasar yang kami tentukan tidak semuanya antarmuka Mapper yang kami definisikan. Oleh karena itu, MapperScannerConfigurer juga memberi kami dua atribut lain yang dapat mempersempit cakupan pencarian dan registrasi. Salah satunya adalah annotationClass dan yang lainnya adalah markerInterface.
annotationClass: Ketika annotationClass ditentukan, MapperScannerConfigurer hanya akan mendaftarkan antarmuka yang ditandai dengan anotasi annotationClass.
markerInterface: markerInterface digunakan untuk menentukan antarmuka. Ketika markerInterface ditentukan, MapperScannerConfigurer hanya akan mendaftarkan antarmuka yang diwarisi dari markerInterface.
Jika kedua properti di atas ditentukan, MapperScannerConfigurer akan menggunakan gabungan keduanya, bukan perpotongannya. Meskipun annotationClass digunakan untuk menandai atau antarmuka yang diwarisi dari markerInterface akan didaftarkan sebagai MapperFactoryBean.
Sekarang dengan asumsi bahwa antarmuka Mapper kita mewarisi antarmuka SuperMapper, maka kita dapat mendefinisikan MapperScannerConfigurer seperti ini.
kode XML
<bean> <nama properti="basePackage" value="com.tiantian.mybatis.mapper" /> <nama properti="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/> </bean>
Jika tag anotasi MybatisMapper digunakan, maka kita dapat mendefinisikan MapperScannerConfigurer seperti ini.
kode XML
<bean> <nama properti="basePackage" value="com.tiantian.mybatis.mapper" /> <nama properti="annotationClass" value="com.tiantian.mybatis.annotation.MybatisMapper"/> </bean>
Selain properti yang digunakan untuk mempersempit cakupan antarmuka Mapper yang terdaftar, kita juga dapat menentukan beberapa properti lainnya, seperti:
sqlSessionFactory: Properti ini sudah tidak digunakan lagi. Saat kita menggunakan beberapa sumber data, kita perlu menggunakan sqlSessionFactory untuk menentukan SqlSessionFactory yang perlu digunakan saat mendaftarkan MapperFactoryBean, karena ketika sqlSessionFactory tidak ditentukan, salah satunya akan secara otomatis disuntikkan dengan cara Autowired. Dengan kata lain, ketika kita hanya menggunakan satu sumber data, yaitu ketika kita hanya mendefinisikan satu SqlSessionFactory, kita tidak perlu menentukan SqlSessionFactory untuk MapperScannerConfigurer.
sqlSessionFactoryBeanName: Fungsinya sama dengan sqlSessionFactory, hanya saja ia menentukan nama kacang yang sesuai dengan SqlSessionFactory yang ditentukan.
sqlSessionTemplate: Atribut ini sudah tidak digunakan lagi. Fungsinya juga setara dengan sqlSessionFactory, karena seperti yang disebutkan sebelumnya, MapperFactoryBean pada akhirnya menggunakan metode getMapper dari SqlSession untuk mendapatkan objek Mapper yang sesuai. Ini hanya perlu ditentukan ketika beberapa SqlSessionTemplates ditentukan. Untuk MapperFactoryBean, hanya satu dari SqlSessionFactory dan SqlSessionTemplate yang diperlukan. Jika keduanya ditentukan, SqlSessionFactory akan diabaikan.
sqlSessionTemplateBeanName: Tentukan nama kacang yang sesuai dengan sqlSessionTemplate yang akan digunakan.
Catatan: Karena penggunaan atribut sqlSessionFactory dan sqlSessionTemplate akan menyebabkan beberapa konten dimuat sebelum PropertyPlaceholderConfigurer, informasi properti eksternal yang digunakan dalam file konfigurasi tidak dapat diganti tepat waktu dan kesalahan akan terjadi Properti sqlSessionFactory dan sqlSessionTemplate telah ditinggalkan di Mybatis-Spring. Disarankan agar Anda menggunakan properti sqlSessionFactoryBeanName dan properti sqlSessionTemplateBeanName.
kode XML
<?xml version="1.0" coding="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"> <nama properti="driverClassName" value="${jdbc.driver}" /> <nama properti="url" value="${jdbc.url}" /> <nama properti="nama pengguna" value="${jdbc.nama pengguna}" /> <nama properti="kata sandi" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <nama properti="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/tiantian/mybatis/mapper/*.xml" /> <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean> <nama properti="basePackage" value="com.tiantian.mybatis.mapper" /> <nama properti="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/> <nama properti="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>
Templat SqlSession
Selain menggunakan antarmuka Mapper secara langsung setelah integrasi di atas, Mybatis-Spring juga memberi kita cara untuk menggunakan SqlSession secara langsung. Mybatis-Spring memberi kita kelas SqlSessionTemplate yang mengimplementasikan antarmuka SqlSession. Ini aman untuk thread dan dapat digunakan oleh banyak Dao secara bersamaan. Pada saat yang sama, ini juga dikaitkan dengan transaksi Spring untuk memastikan bahwa SqlSession yang saat ini digunakan adalah yang telah terikat dengan transaksi Spring. Dan juga dapat mengatur penyerahan dan penutupan Sidang dengan sendirinya. Ketika mekanisme manajemen transaksi Spring digunakan, SqlSession juga dapat dikirimkan dan dibatalkan bersama dengan transaksi Spring.
Saat menggunakan SqlSessionTemplate kita dapat mendefinisikannya di file konfigurasi applicationContext Spring sebagai berikut:
<bean id="sqlSession"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean>
Dengan cara ini, kita dapat langsung menggunakan SqlSessionTemplate untuk memprogram Dao melalui injeksi ketergantungan Spring. Saat ini, Dao kita mungkin terlihat seperti ini:
kode Jawa
paket com.tiantian.mybatis.dao; impor java.util.List; impor javax.annotation.Resource; impor com.tiantian.mybatis.model; Blog; @Repository publicclass BlogDaoImpl mengimplementasikan BlogDao { private SqlSessionTemplate sqlSessionTemplate; publicvoid deleteBlog(int id) { sqlSessionTemplate.delete("com.tiantian.mybatis.mapper.BlogMapper.deleteBlog", id } public Blog temukan(int id) { returnsqlSessionTemplate.selectOne("com.tiantian.mybatis. mapper.BlogMapper.selectBlog", id); } Daftar publik<Blog> find() { returnthis.sqlSessionTemplate.selectList("com.tiantian.mybatis.mapper.BlogMapper.selectAll" } publicvoid insertBlog(Blog blog) { this.sqlSessionTemplate.insert("com.tiantian. mybatis.mapper.BlogMapper.insertBlog", blog); } publicvoid updateBlog(Blog blog) { this.sqlSessionTemplate.update("com.tiantian.mybatis.mapper.BlogMapper.updateBlog", blog } public SqlSessionTemplate getSqlSessionTemplate() { returnsqlSessionTemplate; sqlSessionTemplate) { ini.sqlSessionTemplate = sqlSessionTemplate;
Catatan:
Artikel ini ditulis berdasarkan Mybatis3.2.1, Mybatis-Spring1.1.0 dan Spring3.1.
Di atas adalah analisa singkat proses implementasi integrasi mybatis dan spring yang diperkenalkan pada artikel ini. Saya harap Anda menyukainya. Artikel selanjutnya akan memperkenalkan kepada Anda metode integrasi spring dan mybatis.