Ada banyak keterbatasan saat menggunakan mybatis saja (seperti tidak dapat menerapkan transaksi yang mencakup beberapa sesi), dan banyak sistem bisnis pada awalnya transaksi yang dikelola oleh Spring, jadi MyBatis paling terintegrasi dengan Spring.
Persyaratan Versi
proyek | Versi | Alamat unduhan | menjelaskan |
mybatis | 3.0 dan di atas | https://github.com/mybatis/mybatis-3/releases | |
musim semi | 3.0 dan di atas | http://projects.spring.io/spring-framework/ | |
Mybatis-Spring | 1.0 dan di atas | https://github.com/mybatis/spring/releases |
<!-Pemindaian Otomatis Paket Bisnis-> <Konteks: Komponen-Pemindaian Basis-paket = "com.xxx.service"/> <!-Sumber data-> <jee: jndi-lookup id = "jndidataSource" jndi-name = "java: comp/env/jndidataSource" jndi-name = "java: comp/env/jdbc/datasource" "jndi-name =" java: comp/jdbc/datasource "" comp/datxource "/datxource" <= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = JV/JDBC/JDBC/DATASICE/JAVA/JAVA/INM/JDBC/DATASICER " <nama properti = "DataSource" Ref = "JnDidataSource"/> </ bean> <!-Mengkonfigurasi hal-hal berbasis anotasi AOP-> <tx: transaksi-transaksi yang digerakkan oleh anotasi = "txManager" proxy-target-class = "true"/>
Integrasi tunggal
<!-Integrasi mybatis-> <bean id = "sqlSessionFactory"> <name properti = "dataSource" ref = "jndidataSource" /> <name properti = "configlocation" value = "classpath: /mybatis/mybatis-config.xml" /<! value = "com.xxx.dto" /> </ bean> <!-Buat Dao Bean (cukup berikan antarmuka tetapi bukan kelas implementasi)-> <bean id = "userdao"> <name properti = "mapperInterface" value = "com.xxx.dao.userdao" /<nama properti = "sqlsessionf" sqlsession "sqlsession" sqlsession "sqlsessionface =" sqlsessionface = "sqlsessionface =" sqlsessionface = "sqlsession"
Kita tidak hanya harus memahami cara menggunakannya, tetapi juga memahami mengapa kita menggunakannya seperti ini.
SQLSessionFactoryBean adalah kacang pabrik, dan fungsinya adalah untuk menguraikan konfigurasi (sumber data, alias, dll.).
Mapperfactorybean adalah kacang pabrik. Di Spring Container, kacang pabrik memiliki kegunaan khusus. Ketika musim semi menyuntikkan kacang pabrik ke dalam kacang lainnya, ia tidak menyuntikkan kacang pabrik itu sendiri tetapi menyebut metode GetObject Bean. Mari kita lihat apa yang dilakukan metode getObject ini:
public t getObject () melempar Exception {return getSQLSession (). getMapper (this.mapperInterface); }Setelah melihat ini, Anda harus memahami bahwa metode ini sama dengan ketika kami menggunakan mybatis saja. Kami pertama -tama mendapatkan objek SQLSESSION, dan kemudian mendapatkan objek Mapper dari SQLSession (terhadap Mapper adalah objek proxy, yang membuat antarmuka antarmuka mapper, dan antarmuka ini adalah antarmuka DAO yang disediakan oleh pengguna). Secara alami, injeksi akhir ke lapisan bisnis adalah objek mapper ini.
Secara umum, ada lebih dari satu proyek. Jika Anda memiliki beberapa proyek, maka konfigurasikan secara berurutan sesuai dengan konfigurasi di atas.
Cara menggunakan pembaruan batch
Bagian sebelumnya berbicara tentang cara menyuntikkan objek mapper ke lapisan bisnis. Perilaku Mapper tergantung pada konfigurasi. MyBatis menggunakan satu pembaruan secara default (yaitu, Executorpe Default sederhana bukan batch). Tentu saja, kami dapat memodifikasi perilaku default dengan memodifikasi file konfigurasi mybatis, tetapi jika kami hanya ingin satu atau beberapa pemetaan menggunakan pembaruan batch, itu tidak dapat dilakukan. Saat ini, kita perlu menggunakan teknologi template:
<!-Kustomisasi perilaku mybatis melalui templat-> lt; bean id = "sqlSessionTemplatesImplate"> <constructor-arg index = "0" ref = "sqlSessionFactory"/> <!-update dalam satu mode-> <konstruktor-arg index = "1" value = "simple"//> o./bean-> <konstruktor-arg index = "1" value = "simple" lt; bean id = "sqlSessionTemplateBatch"> <constructor-arg index = "0" ref = "sqlSessionFactory"/> <!-perbarui dalam mode batch-> <konstruktor-arg index = "1" value = "batch"/> </bean>
Di sini, penulis mendefinisikan dua objek templat, satu menggunakan satu pembaruan dan yang lainnya menggunakan pembaruan batch. Setelah kami memiliki template, kami dapat mengubah cara Mapper berperilaku:
<bean id = "userdao"> <name properti = "mapperInterface" value = "com.xxx.dao.userdao" /> <nama properti = "sqlSessionTemplate" ref = "sqlSessionTemplateBatch" /> < /bean> "
Berbeda dari konfigurasi mapper di bagian sebelumnya, tidak perlu mengkonfigurasi properti SQLSessionFactory di sini, Anda hanya perlu mengonfigurasi SQLSessionTemplate (properti SQLSessionFactory telah dikonfigurasi dalam templat).
Sederhanakan konfigurasi pemetaan dengan pemindaian otomatis
Seperti yang dapat Anda lihat di bab sebelumnya, DAO kami perlu dikonfigurasi satu per satu di file konfigurasi. Jika ada banyak DAO, file konfigurasi akan sangat besar, yang akan lebih menyakitkan untuk dikelola. Untungnya, tim Mybatis juga menyadari hal ini. Mereka menggunakan fungsi pemindaian otomatis yang disediakan oleh Spring untuk merangkum kelas alat yang secara otomatis memindai, sehingga kami dapat menggunakan fungsi ini untuk menyederhanakan konfigurasi:
<!-Buat kacang mapper menggunakan pemindaian otomatis (mode pembaruan tunggal)-> <bean> <name properti = "basepackage" value = "com.xxx.dao" /> <name properti = "sqlSessionTemplateBeanName" value = "sqlSessionTemplateSimple" /<Properti name = "markerinter" value = "sqlSessionTemplateSimple" /<Properti name = "markerinter" nearpl "value =" sqlSessionTemplateSImple " /<a name =" manderface "nilai" sqlSessionTemplateSIMPLE " /<" ne propertemPlate " /> </bean> <!-- Create mapper bean using automatic scanning (batch update mode) --> <bean> <property name="basePackage" value="com.xxx.dao" /> <property name="sqlSessionTemplateBeanName" value="sqlSessionTemplateBatch" /> <property name="markerInterface" value = "com.xxx.dao.batchdao" /> < /bean>
Saya tidak akan berbicara tentang teknologi musim semi yang terlibat dalam MappersCannerConfigurer sendiri. Jika Anda tertarik dan memiliki pemahaman yang baik tentang prinsip -prinsip musim semi, Anda dapat memeriksa kode sumbernya. Mari fokus pada tiga propertinya:
Selain menggunakan pemfilteran antarmuka, Anda juga dapat menggunakan penyaringan anotasi:
<!-Buat kacang mapper menggunakan pemindaian otomatis (mode pembaruan batch)-> <bean> <name properti = "basepackage" value = "com.xxx.dao" /> <name properti = "sqlSessionTemplateBeanName" value = "sqlSessionTemplateBatch" /<Properti name = "Nilai" Nilai "Nilai" Nilai "SQLSESSESTEMPLATEBITCH" /<NOVEOCX. "NOVECX." NOVECX. "COMOCX." /> </tac>
AnnotationClass: Hanya ketika anotasi dikonfigurasi akan dipindai oleh pemindai, dan Basepackage adalah fungsi yang sama.
Perlu dicatat bahwa hanya satu dari dua kondisi filter yang dapat dicocokkan.
Contoh: Manajemen Transaksi
Tentukan kelas entitas: emp.java
paket com.lixing.scm.entity; kelas publik emp {private string id; nama string pribadi; seks string pribadi; usia int pribadi; telepon string pribadi; string publik getId () {return id; } public void setId (string id) {this.id = id; } public string getName () {return name; } public void setName (name string) {this.name = name; } public string getsex () {return sex; } public void setSex (string sex) {this.sex = sex; } public int getage () {usia kembali; } public void setage (int usia) {this.age = usia; } public string getPhone () {return phone; } public void setPhone (string phone) {this.phone = phone; }} Tentukan antarmuka operasi internal: empmapper.java
Paket com.lixing.scm.test.mapper; import java.util.list; import java.util.map; import com.lixing.scm.entity.emp; empmapper antarmuka publik {void insertemp (emp emp); Daftar <emp> getAllemp (); Emp getById (ID String); void deleteemp (string id); void updateemp (peta <string, object> peta);} Tentukan file pemetaan untuk antarmuka operasi kelas entitas: empmapper.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"> namespace = "com.lixing.scm.test.mapper.empmapper"> <parameterMap type = "com.lixing.scm.entity.emp" id = "parameterMapemp"> <parameter properti = "id"/<parameter properti = "nama"/> <parameter Property = "sex"/<parameter/parameter = "name"/<parameter Property = "Sex"/<parameter/parameter = "name" <resultMap type = "com.lixing.scm.entity.emp" id = "resultMapemp"> <properti result = "id" kolom = "id"/> <properti result = "name" column = "name"/> <result property = "sex" column = "sex"/<hasil hasil = "usia"/> <properti result = "seumur" usia "/<" era "/> <" usia "/<" era "/<" era "/<" era "/<" id = "insertemp" parameterMap = "parameterMapemp"> masukkan ke dalam emp (id, nama, jenis kelamin, usia, telepon, telepon) nilai (?,?,?,?,?) </masukkan <pilih id = "getAllemp" resultMap = "hasil hasil =" dari emp </pilih> <pilih id = "getbyid" paramerType = "paramerpeP"> dari emp </pilih> <pilih id = "getbyid" paramerType = "paramerpeP"> dari emp </pilih> <pilih id = "getbyid" parameTypeP = "ParamerType =" paramerpeP = "paramer =" paramerpeP = "paramEppeP =" paramEppeP = "ParamerPeP =" ParamerPeP = "PARAMETPEP =" id =#{value} </sfect> <delete id = "deleteemp" parameTerType = "string"> hapus dari emp where id =#{value} </belete> <update id = "updateemp" parameTerType = "java.util.map"> update emp atur name =#{name}, seks =#{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{#{{{{#{{#{{#{{{#{{{##{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{#{ id =#{id} </update> </mapper3.0.6 Definisi: applicationContext.xml <? xml versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema" " xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema/context" xmlns: aop = "http:schema/context" xmlns: aop = "http:schema/context" xmlns: aop = "http:schaMaMor xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/www.spramework.org/schema/www.spramewework.org/schema/scema/www.spramework.org/schema/tp http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http:/spramework.org/schema/aop:aop:/spramework.org/schema/aop:aop: <konteks: anotasi-konfigurasi /> <konteks: komponen-scan-package = "com.lixing.scm.test.*" /> <!-jdbc.properis direktori-> <bean> <name properti = "close =" classpath: jdbc.properties " /< /bean> <" close = "mydat.prooperte" /< /bean> <bean = "classpath: jdbc.properies" /< /bean> <bean = "classpath: jdbc.properies" / /< /bean> <bean = "classpath: jdbc.properies" / /bean < /bean> <bean = = "mydat. name = "driverclassName" value = "$ {jdbc.driverclassname}" /> <name properti = "url" value = "$ {jdbc.url}" /> <name properti = "nama pengguna" /$ "$ {jdbc.userName}" /<name a name = "$ {jdbc.pord {jdbc <!-SQLSessionFactory-> <bean id = "sqlSessionFactory"> <name properti = "DataSource" ref = "mydataSource" /> < /bean> <!-scanmapperfiles-> <bean> <nama properti = "basepackage" value = "com.lixing.sc.sc.test.test.test.test.test.prest ==================================================================================================================================================================== <name bean = "transactionManager"> <name properti = "DataSource" ref = "mydataSource"> </property> </ bean> <tx: nasihat id = "usertxadvice" transaction-manager = "transactionagager"> <tx: attributes> <tx: metode metode = "delete*" delete = "wajib =" disyaratkan = "false" rollback-for = "java.lang.Exception" no-rollback-for = "java.lang.runtiMeException" /> <tx: Metode nama = "masukkan*" propagasi = "wajib"-hanya = "FALSE" FALSE "NODE =" JAVA.LANG.RUNTIMEEXEXCEPTIONE "DIBUTUHKAN" /FALSE: "FALSE" METODE = "JAVA.LANG. rollback-for = "java.lang.exception"/> <tx: metode nama = "temukan*" propagasi = "dukungan"/> <tx: nama metode = "dapatkan*" propagasi = "dukungan"/> <tx: name = "soal*" propagasi = "dukungan"/</tx: ATTRIBUTS> "TX: AOP: AOP: AOP: AOP: AOP: AOP: AOP: AOP: AOP: AOP: ATPAGATION: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRIUT: ATRibut: Ekspresi = "Eksekusi (publik*com.lixing.scm.test.service.*.*(..))" /> <!-Kontrol transaksi di tingkat layanan-> <aop: penasihat pointcut-ref = "pc" nasihat-ref = "UsertxAdvice" /< /aop: config> <!-oud-bean oud (uSertxAdvice " /> < /aOp: config> <!-yang berikut ini adalah bean custom-" custom "oud =" BEAN "ADIPIRE =" BEAN "ADIPER" ATNO "ATNO" ATNO "BEAN" /BEAN " /BEAN" /KADIPLE "IDEP CUSTRICE /BEAN" <bean id = "empservice" autowire = "byname"/> </tac> Antarmuka DAO: empdao.java
Paket com.lixing.scm.test.dao; import java.util.list; import java.util.map; import com.lixing.scm.entity.emp; antarmuka publik empdao {void insertemp (emp emp); Daftar <emp> getAllemp (); Emp getById (ID String); void deleteemp (string id); void updateemp (peta <string, object> peta);} Kelas Implementasi Antarmuka DAO: empdaoImpl.java
Paket com.lixing.scm.test.dao.impl; import java.util.list; import java.util.map; import com.lixing.scm.entity.emp; com.lixing.scm.test.dao.empdao; empmapper; // Suntikkan empmapper di sini // Empmapper ini secara otomatis dihasilkan oleh Spring // kita tidak perlu mendefinisikan secara manual @Override public void insertemp (emp emp) {this.empmapper.insertemp (emp); Lempar RuntimeException baru ("Kesalahan"); // uji lemparan runtimeException // pengecualian untuk melihat apakah database memiliki catatan} @Override public void deleteEmp (string id) {this.empmapper.deleteemp (id); } @Override Daftar publik <emp> getAllemp () {return this.empmapper.getAllemp (); } @Override Public emp getById (ID String) {return this.empmapper.getById (id); } @Override public void updateemp (peta <string, object> peta) {this.empmapper.updateemp (peta); } empmapper publik getempmapper () {return empmapper; } public void setempmapper (empmapper empmapper) {this.empmapper = empmapper; }} Antarmuka Layer Layanan: Empservice.java
Paket com.lixing.scm.test.service; import com.lixing.scm.entity.emp; antarmuka publik Empservice {void insertemp (emp emp);} Kelas Implementasi Antarmuka Layanan Layanan: EmpserviceImpl.java
Paket com.lixing.scm.test.service.impl; import com.lixing.scm.entity.emp; import com.lixing.scm.test.dao.empdao; impor com.lixing.scm.test.service.empservice; empserviceImpl kelas publik Impservice {swasterservice.empservice; empoServiceImpl Kelas publik Implement empservice {swasters cdrivate {private -class empserviceMpl @Override public void insertemp (emp emp) {empdao.insertemp (emp); } public empdao getempdao () {return empdao; } public void setempdao (empdao empdao) {this.empdao = empdao; }} Kelas Tes: Testempservice.java
Impor org.junit.test; impor org.springframework.context.applicationContext; impor org.springframework.context.support.classpathxmlappLicationContext; com.lixing. testtrasaction () {emp emp = emp baru (); emp.setid ("00000003"); emp.setname ("某某某"); emp.setage (50); emp.setsex ("pria"); emp.setphone ("566666"); ApplicationContext ctx = new ClassPathXMLapPlicationContext ("ClassPath: ApplicationContext.xml"); Layanan EmpService = ctx.getBean (empservice.class); service.insertemp (emp); }}