Es gibt viele Einschränkungen bei der Verwendung von MyBatis allein (z.
Versionsanforderungen
Projekt | Version | Adresse herunterladen | veranschaulichen |
mybatis | 3.0 und höher | https://github.com/mybatis/mybatis-3/releases | |
Frühling | 3.0 und höher | http://projects.spring.io/spring-framework/ | |
MyBatis-Spring | 1,0 und höher | https://github.com/mybatis/spring/releases |
<!-Automatisches Scannen von Geschäftspaketen-> <Kontext: Komponenten-scan-Basis-Package = "com.xxx.service"/> <!-Datenquelle-> <Jee: JNDI-Lookup ID = "jndidatasource" JNDI-NAME = "JAVA: COMP/ENV/ENV/JDBC/DATASORCE"/> <! <Eigenschaft name = "dataSource" ref = "jnDidataSource"/> </bean> <!-Konfigurieren Sie Annotationsbasis AOP-> <TX: Annotationsgetriebene Transaktionsmanager = "TxManager" Proxy-Target-Class = "True"/>
Einzelintegration
<!-Integration von myBatis-> <bean id = " value = "com.xxx.dto" /> < /bean> <!-DAO-Bean erstellen (nur Schnittstellen, aber keine Implementierungsklassen)-> <bean id = "userDao"> <Eigenschaft name = "mapperinterface" value = "com.xxx.dao.userdaooo /> < /> < /> < /> bandname =" sqlSessionfactory ".
Wir müssen nicht nur verstehen, wie man es benutzt, sondern auch verstehen, warum wir es so verwenden.
SQLSessionFactoryBean ist eine Werksbean, und ihre Funktion besteht darin, Konfigurationen (Datenquelle, Alias usw.) zu analysieren.
MapperFactoryBean ist eine Werksbohne. In Frühlingsbehälter haben Fabrikbohnen besondere Zwecke. Wenn die Frühlingsfabrik Fabrikbohnen in andere Bohnen injiziert, injiziert es nicht die Fabrikbohne selbst, sondern ruft die GetObject -Methode der Bean auf. Schauen wir uns an, was diese GetObject -Methode tut:
public t getObject () löst eine Ausnahme aus {returnsQlSession (). getMapper (this.mapperInterface); }Nachdem Sie dies gesehen haben, sollten Sie verstehen, dass diese Methode die gleiche ist wie bei der Verwendung von MyBatis allein. Wir erhalten zuerst ein SQLSession -Objekt und dann das Mapper -Objekt aus der SQLSession (gegen den Mapper ist ein Proxy -Objekt, das die Mapper -Schnittstellenschnittstelle verfolgt, und diese Schnittstelle ist die von dem Benutzer bereitgestellte DAO -Schnittstelle). Natürlich ist die endgültige Injektion in die Geschäftsschicht dieses Mapper -Objekt.
Im Allgemeinen gibt es mehr als ein Projekt. Wenn Sie mehrere Projekte haben, konfigurieren Sie sie nach der obigen Konfiguration nacheinander.
So verwenden Sie Stapel -Updates
Im vorherigen Abschnitt wurde darüber gesprochen, wie ein Mapper -Objekt in die Geschäftsschicht einfließen kann. Das Verhalten von Mapper hängt von der Konfiguration ab. MyBatis verwendet standardmäßig ein einzelnes Update (dh der Standard -Auslöser ist einfach anstelle von Stapel). Natürlich können wir das Standardverhalten ändern, indem wir die MyBatis -Konfigurationsdatei ändern. Wenn wir jedoch nur einen oder mehrere Mapper wünschen, kann dies nicht erfolgen. Zu diesem Zeitpunkt müssen wir die Template -Technologie verwenden:
<!-das Verhalten von mybatis durch templates-> lt; bean id = "sqlSessionTemPlateSimple"> <constructor-arg Index = "0" ref = "SQLSessionFactory"/> <! lt; bean id = "sqlSessionTemplatebatch"> <constructor-arg index = "0" ref = "
Hier definiert der Autor zwei Vorlagenobjekte, eine mit einem einzigen Update und das andere mithilfe der Batch -Update. Nachdem wir die Vorlage haben, können wir die Art und Weise ändern, wie sich Mapper verhält:
<bean id = "userDao"> <Eigenschaft name = "mapperInterface" value = "com.xxx.dao.userdao" /> <Eigenschaft name = "
Anders als bei der Mapper -Konfiguration im vorherigen Abschnitt müssen die SQLSessionFactory -Eigenschaft hier nicht konfiguriert werden. Sie müssen nur die SQLSessionTemplate konfigurieren (die SQLSessionFactory -Eigenschaft wurde in der Vorlage konfiguriert).
Vereinfachen Sie die Konfiguration von Mappern mit automatischem Scannen
Wie Sie im vorherigen Kapitel sehen können, muss unser DAO nacheinander in der Konfigurationsdatei konfiguriert werden. Wenn es viele DAO gibt, ist die Konfigurationsdatei sehr groß, was schmerzhafter zu verwalten ist. Glücklicherweise erkannte das MyBatis -Team dies ebenfalls. Sie verwendeten die automatische Scanfunktion, die von Spring bereitgestellt wurde, um eine Werkzeugklasse zu verkapulieren, die automatisch scannt, damit wir diese Funktion verwenden können, um die Konfiguration zu vereinfachen:
<!-MAPPER-Bean mit automatischem Scannen erstellen (Einzel-Update-Modus)-> <bean> <Eigenschaft name = "Basepackage" value = "com.xxx.dao" /> <Eigenschaft name = " < /bean> <!-Mapper Bean mit automatischem Scannen (Batch-Update-Modus)-> <bean> <Eigenschaft name = "Basepackage" value = "com.xxx.dao" /> <Eigenschaft name = " /> < /bean>
Ich werde nicht über die Frühlings -Technologie sprechen, die in MapperscannerConfigurer selbst beteiligt ist. Wenn Sie interessiert sind und die Prinzipien des Frühlings ein gutes Verständnis haben, können Sie den Quellcode überprüfen. Konzentrieren wir uns auf seine drei Eigenschaften:
Zusätzlich zur Verwendung der Schnittstellenfilterung können Sie auch Annotationsfilter verwenden:
<!-MAPPER Bean mit automatischem Scannen (Batch-Update-Modus)-> <bean> <Eigenschaft name = "Basepackage" value = "com.xxx.dao" /> <Eigenschaft name = " </bean>
AnnotationClass: Erst wenn die Annotation konfiguriert ist, wird sie vom Scanner gescannt, und der Grundpacken ist die Funktion desselben.
Es ist zu beachten, dass nur eine der beiden Filterbedingungen übereinstimmt werden kann.
Beispiel: Transaktionsmanagement
Definieren Sie eine Entitätsklasse: emp.java
Paket com.lixing.scm.Entity; öffentliche Klasse EMP {private String -ID; privater Zeichenfolge Name; privater String Sex; privates int Alter; privates String -Telefon; public String getid () {return id; } public void setID (String -ID) {this.id = id; } public String getName () {return name; } public void setName (String -Name) {this.name = name; } public String getSex () {Return Sex; } public void setsex (String sex) {this.sex = sex; } public int getage () {return ay; } public void setage (int age) {this.age = älter; } public String getphone () {return telefon; } public void setPhone (String -Telefon) {this.phone = Telefon; }} Definieren Sie die interne Operationsschnittstelle: empMapper.java
Paket com.lixing.scm.test.mapper; import java.util.list; import java.util.map; import com.lixing.scm.Entity.emp; public interface empmapper {void Insertemp (EMP EMP); Liste <EMP> getAllemp (); EMP getbyId (String -ID); void DeleteEMP (String -ID); void updateemp (map <string, object> map);} Definieren Sie die Zuordnungsdatei für die Entitätsklassen -Operation Interface: empMapper.xml
<? namespace = "com.lixing.scm.test.mapper.empMapper"> <parametermap type = "com.lixing.scm.Entity.EMP" id = "parameterMapemp"> <parameter Eigenschaft = "ID"/> <parameter agy "name"/> <parameter Eigenschaft = "sexy"/> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> </> <Parameter Eigenschaft "/> <Parameter. <resultMap type = "com.lixing.scm.Entity.emp" id = "resultMapeMP"> <resulting Eigenschaft = "id" column = "id"/> <result Eigenschaft = "name" column = "name"/> <result achance id = "insertEmp" parametermap = "parameterMapemp"> in EMP (ID, Name, Geschlecht, Alter, Telefon) Werte (?,?,?,?,?) </einfügen> <select id = "getAllEmp" resultMap = "resultMapeMP"> select * aus EMP </selectMap = "resetById" von EMPETMAD ". id=#{value} </select> <delete id="deleteEmp" parameterType="String"> DELETE FROM emp WHERE id=#{value} </delete> <update id="updateEmp" parameterType="java.util.Map"> UPDATE emp SET name=#{name},sex=#{sex},age=#{age},phone=#{phone} WHERE id =#{id} </update> </minkper> spring3.0.6 Definition: applicationContext.xml <? xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation = "http://www.spingframework.org/schema/beans http://www.spingframe.org/schema/beans- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.spingframework.org/tx/tx/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframe.g/schema/aop/sping/sping- <CONTEXT: Annotation-Config /> <Kontext: Komponenten-scan-Basis-Package = "com.lixing.scm.test. name = "triverClassName" value = "$ {jdbc.driverClassName}" /> <Eigenschaft name = "url" value = "$ {jdbc.url}" /> <Eigenschaft name = "userername" value = "$ {jdbc.username}" /> <property name = "password" {{{{{{{{{{{{{{{{{{{vactword "-{{kennwort"-{{{{{-{{{{{vact "-{{{{{{{vactword | SqlSessionFactory-> <bean id = " =====================================================ieben <bean name = "transactionManager"> <Eigenschaft name = "dataSource" ref = "mydataSource"> </property> </bean> <tx: patce id = "usertxadvice" transaction-Manager = "transactionManager"> <tx: Attribute> <tx: method name = "propagation". no-rollback-for = "java.lang.runtimeexception" /> <tx: method name = "einfügen name="find*" propagation="SUPPORTS"/> <tx:method name="get*" propagation="SUPPORTS"/> <tx:method name="select*" propagation="SUPPORTS"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="pc" expression="execution(public * com.lixing.scm.test.service.*.*(..)) " /> <!-Kontrolltransaktionen auf Serviceebene-> <AOP: Berater pointcut-ref =" PC "Ratschläge-ref =" UsertxAdvice " /> < /AOP: config> <! id = "EmpService" AutoWire = "Byname"/> </beans> DAO -Schnittstelle: empdao.java
Paket com.lixing.scm.test.dao; import java.util.list; import java.util.map; com.lixing.scm.Entity.emp; public interface empdao {void Insertemp (EMP EMP); Liste <EMP> getAllemp (); EMP getbyId (String -ID); void DeleteEMP (String -ID); void updateemp (map <string, object> map);} DAO -Schnittstelle Implementierungsklasse: 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 EMPMAPPER; // hier einen empMapper einmischen // Dieser EmpMapper wird automatisch durch Spring // generiert // Wir müssen @Override public void InsertEMP (EMP EMP) nicht manuell definieren. Neue RunTimeException ("Fehler") werfen; // Test löscht RunTimeException // Ausnahme an, ob die Datenbank Datensätze enthält. } @Override public list <EMP> getAllemp () {return this.eMpMapper.getAllemp (); } @Override public emp getbyId (String -ID) {return this.empMapper.getById (id); } @Override public void updateMP (MAP <String, Object> Map) {this.eMpMapper.UpdateEMP (MAP); } public empMapper getEmpMapper () {return empMapper; } public void setempmapper (empMapper empMapper) {this.eMpMapper = empMapper; }} Service Layer -Schnittstelle: EmpService.java
Paket com.lixing.scm.test.service; import com.lixing.scm.Entity.emp; Public Interface EmpService {void InsertEMP (EMP EMP);} Implementierungsklasse für Service Layer -Schnittstelle: EmpServiceImpl.java
Paket com.lixing.scm.test.service.impl; import com.lixing.scm.Entity.emp; import com.lixing.scm.test.dao.empdao; com.lixing @Override public void InsertEMP (EMP EMP) {empdao.insertemp (EMP); } public empdao getEmpdao () {return empdao; } public void setEmpdao (empdao empdao) {this.eMpdao = empdao; }} Testklasse: testEmpService.java
import org.junit.test; import org.springframework.context.applicationcontext; import org.springframework testTrasaction () {emp emp = new EMP (); Emp.SetID ("00000003"); Emp.SetName ("某某某"); Emp.Setage (50); emp.setSex ("männlich"); Emp.Setphone ("566666"); ApplicationContext ctx = new classPathXmlApplicationContext ("classPath: applicationContext.xml"); EmpService Service = ctx.getbean (EmpService.Class); Service.insertemp (EMP); }}