Laut offizieller Aussage wurde die Entwicklungsarbeit von Spring3 vor dem Aufkommen von ibatis3, also Mybatis3, abgeschlossen, sodass Mybatis3 in Spring3 immer noch nicht unterstützt wird. Aus diesem Grund hat die Mybatis-Community Mybatis-Spring selbst entwickelt, um den Anforderungen der Mybatis-Benutzer an die Integration von Spring gerecht zu werden. Im Folgenden wird eine kurze Einführung in die Verwendung der Integration von Mybatis und Spring über Mybatis-Spring gegeben.
MapperFactoryBean
Zuerst müssen wir das Mybatis-Spring-JAR-Paket von der offiziellen Mybatis-Website herunterladen und zum Klassenpfad unseres Projekts hinzufügen. Natürlich müssen wir auch das zugehörige JAR-Paket von Mybatis und das zugehörige JAR-Paket von Spring hinzufügen. Wir wissen, dass alle Vorgänge in Mybatis auf einer SqlSession basieren und SqlSession von SqlSessionFactory generiert wird und SqlSessionFactory von SqlSessionFactoryBuilder generiert wird. Aber Mybatis-Spring basiert auf SqlSessionFactoryBean. Wenn wir Mybatis-Spring verwenden, benötigen wir auch SqlSession. Diese SqlSession ist in das Programm eingebettet und erfordert im Allgemeinen keinen direkten Zugriff darauf. SqlSession wird ebenfalls von SqlSessionFactory generiert, aber Mybatis-Spring kapselt eine SqlSessionFactoryBean für uns. In dieser Bean verwenden wir weiterhin SqlSessionFactoryBuilder, um die entsprechende SqlSessionFactory einzurichten und dann die entsprechende SqlSession abzurufen. Über SqlSessionFactoryBean können wir einige Konfigurationsinformationen von Mybatis bereitstellen, indem wir einige Eigenschaften darauf angeben. Als nächstes müssen wir also eine SqlSessionFactoryBean in der applicationContext-Konfigurationsdatei von Spring definieren.
XML-Code
<bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml" / > <property name="typeAliasesPackage" value="com.tiantian.ckeditor.model" /> </bean>
Bei der Definition von SqlSessionFactoryBean muss das dataSource-Attribut angegeben werden, das die Datenquelle darstellt, die zum Herstellen einer Verbindung zur Datenbank verwendet wird. Natürlich können wir auch einige andere Attribute angeben. Hier sind einige:
MapperLocations: Gibt den Speicherort unserer Mapper-Datei an. Wenn sich unsere Mapper-Datei am selben Speicherort wie die entsprechende Mapper-Schnittstelle befindet, muss der Wert dieses Attributs nicht angegeben werden.
configLocation: wird verwendet, um den Speicherort der Konfigurationsdatei von Mybatis anzugeben. Wenn dieses Attribut angegeben ist, wird der entsprechende SqlSessionFactoryBuilder unter Verwendung des Inhalts der Konfigurationsdatei als Konfigurationsinformationen erstellt, der durch nachfolgende Attribute angegebene Inhalt überschreibt jedoch den entsprechenden in der Konfigurationsdatei angegebenen Inhalt.
typeAliasesPackage: Es entspricht im Allgemeinen dem Paket, in dem sich unsere Entitätsklasse befindet. Zu diesem Zeitpunkt wird der einfache Klassenname im entsprechenden Paket, der den Paketnamen nicht enthält, automatisch als Alias verwendet. Mehrere Pakete können durch Kommas oder Semikolons getrennt werden.
typeAliases: Array-Typ, der zur Angabe von Aliasen verwendet wird. Nach Angabe dieses Attributs verwendet Mybatis den Kurznamen dieses Typs als Alias dieses Typs, sofern die Annotation @Alias nicht in der Klasse markiert ist. Andernfalls wird der der Annotation entsprechende Wert als Alias verwendet dieser Typ.
XML-Code
<property name="typeAliases"> <array> <value>com.tiantian.mybatis.model.Blog</value> <value>com.tiantian.mybatis.model.Comment</value> </array> </property >
Plugins: Array-Typ, der zur Angabe des Interceptors von Mybatis verwendet wird.
typeHandlersPackage: Wird verwendet, um das Paket anzugeben, in dem sich der TypeHandler befindet. Wenn dieses Attribut angegeben ist, registriert SqlSessionFactoryBean die Klassen unter dem Paket automatisch als den entsprechenden TypeHandler. Mehrere Pakete können durch Kommas oder Semikolons getrennt werden.
typeHandlers: Array-Typ, der TypeHandler darstellt.
Der nächste Schritt besteht darin, die MapperFactoryBean zu definieren, die dem gewünschten Mapper-Objekt in der applicationContext-Datei von Spring entspricht. Das gewünschte Mapper-Objekt kann über MapperFactoryBean abgerufen werden. MapperFactoryBean implementiert die FactoryBean-Schnittstelle von Spring, sodass MapperFactoryBean das entsprechende Mapper-Objekt über die in der FactoryBean-Schnittstelle definierte getObject-Methode erhält. Bei der Definition einer MapperFactoryBean müssen wir zwei Eigenschaften einfügen: Die eine ist die von Mybatis-Spring verwendete SqlSessionTemplate-Objekte, die die SqlSession-Schnittstelle implementiert.
Nachdem wir die MapperFactoryBean definiert haben, die der entsprechenden Mapper-Schnittstelle entspricht, können wir unsere entsprechende Mapper-Schnittstelle in das von Spring verwaltete Bean-Objekt, beispielsweise das Service-Bean-Objekt, einfügen. Wenn wir auf diese Weise die entsprechende Mapper-Schnittstelle verwenden müssen, ruft MapperFactoryBean die entsprechende Mapper-Schnittstelle von seiner getObject-Methode ab, und getObject ruft intern weiterhin die getMapper-Methode (Mapper-Schnittstelle) der SqlSession-Schnittstelle über die von uns injizierten Eigenschaften auf, um sie zurückzugeben die entsprechende Mapper-Schnittstelle. Auf diese Weise wird die Integration von Mybatis und Spring durch die Übergabe von SqlSessionFactory und der entsprechenden Mapper-Schnittstelle an das Spring-Management erreicht.
Springs applicationContext.xml-Konfigurationsdatei:
XML-Code
<?xml version="1.0" binding="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}" /> <property name ="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath: com/tiantian/mybatis/mapper/*.xml"/> <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean id="blogMapper"> <property name="mapperInterface" value="com.tiantian.mybatis.mapper.BlogMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </ bean> Bohnen> </beans>
BlogMapper.xml-Datei:
XML-Code
<?xml version="1.0" binding="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"> <!-- Neuen Datensatz hinzufügen--> <insert id="insertBlog" parameterType="Blog" useGeneratedKeys="true" keyProperty="id"> insert into t_blog(title,content,owner) Values(#{title},#{content},#{owner}) </ insert> <!-- Einen einzelnen Datensatz abfragen--> <select id="selectBlog" parameterType="int" resultMap="BlogResult"> select * from t_blog where id = #{id} </select> <!-- Datensatz ändern--> <update id="updateBlog" parameterType="Blog"> update t_blog set title = #{title},content = #{content},owner = #{owner} wobei id = #{id} </update> <!-- Alle Datensätze abfragen--> <select id="selectAll" resultType="Blog"> select * from t_blog </select> <!-- Datensätze löschen -> <delete id="deleteBlog" parameterType="int"> aus t_blog löschen, wobei id = #{id} </delete> </mapper>
BlogMapper.java:
Java-Code
package com.tiantian.mybatis.mapper; import java.util.Blog; public Blog selectBlog(int id); publicvoid updateBlog; ); publicvoid deleteBlog(int id); public List<Blog> selectAll( }
BlogServiceImpl.java:
Java-Code
package com.tiantian.mybatis.service.impl; import javax.annotation.Resource; import com.tiantian.mybatis.mapper. mybatis.model.Blog; import com.tiantian.mybatis.service.BlogService; @Service publicclass BlogServiceImpl implementiert BlogService {private BlogMapper blogMapper; publicvoid deleteBlog(int id) { blogMapper.deleteBlog(id); publicvoid insertBlog(Blog-Blog) { blogMapper.insertBlog(blog); } publicvoid updateBlog(Blog-Blog) { blogMapper.updateBlog(blog); } public BlogMapper getBlogMapper() { returnblogMapper; } @Resource publicvoid setBlogMapper(blogMapper) { this.blogMapper = blogMapper;
MapperScannerConfigurer
Wenn wir die obige Methode zur Integration verwenden und einen Mapper haben, müssen wir eine entsprechende MapperFactoryBean definieren. Wenn wir relativ wenige Mapper haben, ist das in Ordnung, aber wenn wir ziemlich viele Mapper haben, definieren wir jeden Mapper wie folgt entsprechende MapperFactoryBean scheint langsamer zu sein. Zu diesem Zweck stellt uns Mybatis-Spring eine Klasse namens MapperScannerConfigurer zur Verfügung. Über diese Klasse registriert Mybatis-Spring automatisch das MapperFactoryBean-Objekt, das Mapper entspricht.
Wenn wir MapperScannerConfigurer verwenden müssen, um die Mapper-Schnittstelle automatisch zu scannen und zu registrieren, müssen wir in der applicationContext-Konfigurationsdatei von Spring eine Bean definieren, die MapperScannerConfigurer entspricht. Für MapperScannerConfigurer müssen wir ein Attribut angeben, und zwar basePackage. Mit basePackage wird das Basispaket angegeben, in dem sich die Mapper-Schnittstellendatei befindet. Die Mapper-Schnittstellen unter diesem Basispaket oder allen seinen Unterpaketen werden durchsucht. Mehrere Basispakete können durch Kommas oder Semikolons getrennt werden. Die einfachste MapperScannerConfigurer-Definition besteht darin, nur ein basePackage-Attribut anzugeben, wie zum Beispiel:
XML-Code
<bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> </bean>
Auf diese Weise scannt MapperScannerConfigurer alle Schnittstellen unter dem angegebenen Basispaket und registriert sie als MapperFactoryBean-Objekte. Wenn Sie MapperScannerConfigurer verwenden und das basePackage-Attribut hinzufügen, sieht die applicationContext-Konfigurationsdatei in unserem Beispiel oben wie folgt aus:
XML-Code
<?xml version="1.0" binding="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}" /> <property name ="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath: com/tiantian/mybatis/mapper/*.xml" /> <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> </bean> </beans>
Manchmal umfasst das von uns angegebene Basispaket nicht alle von uns definierten Mapper-Schnittstellen. Aus diesem Grund stellt uns MapperScannerConfigurer auch zwei weitere Attribute zur Verfügung, die den Such- und Registrierungsbereich einschränken können. Eine davon ist annotationClass und die andere ist markerInterface.
annotationClass: Wenn annotationClass angegeben ist, registriert MapperScannerConfigurer nur Schnittstellen, die mit der Annotation annotationClass gekennzeichnet sind.
markerInterface: markerInterface wird verwendet, um eine Schnittstelle anzugeben. Wenn markerInterface angegeben wird, registriert MapperScannerConfigurer nur die von markerInterface geerbte Schnittstelle.
Wenn beide oben genannten Eigenschaften angegeben sind, verwendet MapperScannerConfigurer ihre Vereinigung anstelle ihrer Schnittmenge. Auch wenn annotationClass zum Markieren verwendet wird oder die von markerInterface geerbte Schnittstelle als MapperFactoryBean registriert wird.
Nehmen wir nun an, dass unsere Mapper-Schnittstelle eine SuperMapper-Schnittstelle erbt, dann können wir unseren MapperScannerConfigurer wie folgt definieren.
XML-Code
<bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> <property name="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/> </bean>
Wenn das Annotation-MybatisMapper-Tag verwendet wird, können wir unseren MapperScannerConfigurer wie folgt definieren.
XML-Code
<bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> <property name="annotationClass" value="com.tiantian.mybatis.annotation.MybatisMapper"/> </bean>
Zusätzlich zu den Eigenschaften, die zum Einschränken des Umfangs der registrierten Mapper-Schnittstelle verwendet werden, können wir auch einige andere Eigenschaften angeben, wie zum Beispiel:
sqlSessionFactory: Diese Eigenschaft ist veraltet. Wenn wir mehrere Datenquellen verwenden, müssen wir sqlSessionFactory verwenden, um die SqlSessionFactory anzugeben, die bei der Registrierung von MapperFactoryBean verwendet werden muss, denn wenn sqlSessionFactory nicht angegeben ist, wird eine automatisch auf Autowired-Art injiziert. Mit anderen Worten: Wenn wir nur eine Datenquelle verwenden, also nur eine SqlSessionFactory definieren, müssen wir SqlSessionFactory nicht für MapperScannerConfigurer angeben.
sqlSessionFactoryBeanName: Seine Funktion ist die gleiche wie sqlSessionFactory, außer dass es den Bean-Namen angibt, der der definierten SqlSessionFactory entspricht.
sqlSessionTemplate: Dieses Attribut ist veraltet. Seine Funktion entspricht auch sqlSessionFactory, da MapperFactoryBean, wie bereits erwähnt, letztendlich die getMapper-Methode von SqlSession verwendet, um das entsprechende Mapper-Objekt abzurufen. Es muss nur angegeben werden, wenn mehrere SqlSessionTemplates definiert sind. Für eine MapperFactoryBean ist nur eine von SqlSessionFactory und SqlSessionTemplate erforderlich. Wenn beide angegeben sind, wird SqlSessionFactory ignoriert.
sqlSessionTemplateBeanName: Geben Sie den Bean-Namen an, der dem zu verwendenden sqlSessionTemplate entspricht.
Hinweis: Da die Verwendung der Eigenschaften sqlSessionFactory und sqlSessionTemplate dazu führt, dass einige Inhalte vor PropertyPlaceholderConfigurer geladen werden, können die in der Konfigurationsdatei verwendeten externen Eigenschaftsinformationen nicht rechtzeitig ersetzt werden und es treten daher Fehler auf Die Eigenschaften sqlSessionFactory und sqlSessionTemplate wurden in Mybatis-Spring aufgegeben. Es wird empfohlen, die Eigenschaften sqlSessionFactoryBeanName und sqlSessionTemplateBeanName zu verwenden.
XML-Code
<?xml version="1.0" binding="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"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="sqlSessionFactory"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/tiantian/mybatis/mapper/*.xml" /> <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> <property name="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>
SqlSessionTemplate
Neben der direkten Verwendung der Mapper-Schnittstelle nach der oben genannten Integration bietet uns Mybatis-Spring auch die Möglichkeit, SqlSession direkt zu verwenden. Mybatis-Spring stellt uns eine SqlSessionTemplate-Klasse zur Verfügung, die die SqlSession-Schnittstelle implementiert. Sie ist threadsicher und kann von mehreren Dao gleichzeitig verwendet werden. Gleichzeitig ist es auch mit der Spring-Transaktion verknüpft, um sicherzustellen, dass die aktuell verwendete SqlSession eine ist, die an die Spring-Transaktion gebunden wurde. Außerdem kann es die Übermittlung und den Abschluss einer Sitzung selbst verwalten. Wenn der Transaktionsverwaltungsmechanismus von Spring verwendet wird, kann SqlSession auch zusammen mit den Transaktionen von Spring übermittelt und zurückgesetzt werden.
Wenn wir SqlSessionTemplate verwenden, können wir es in der applicationContext-Konfigurationsdatei von Spring wie folgt definieren:
<bean id="sqlSession"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean>
Auf diese Weise können wir SqlSessionTemplate direkt zum Programmieren in Dao über die Abhängigkeitsinjektion von Spring verwenden. Zu diesem Zeitpunkt könnte unser Dao so aussehen:
Java-Code
Paket com.tiantian.mybatis.dao; import java.annotation.Resource; import org.mybatis.spring.SqlSessionTemplate; import com.tiantian.mybatis.model. Blog; @Repository publicclass BlogDaoImpl implementiert BlogDao { private SqlSessionTemplate sqlSessionTemplate; publicvoid deleteBlog(int id) { sqlSessionTemplate.delete("com.tiantian.mybatis.mapper.BlogMapper.deleteBlog", id); } public Blog find(int id) { returnsqlSessionTemplate.selectOne("com.tiantian.mybatis. mapper.BlogMapper.selectBlog", id); } public List<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 () { returnsqlSessionTemplate; } @Resource publicvoid setSqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate;
Notiz:
Dieser Artikel basiert auf Mybatis3.2.1, Mybatis-Spring1.1.0 und Spring3.1.
Das Obige ist eine kurze Analyse des in diesem Artikel vorgestellten Integrationsprozesses von Mybatis und Spring. Ich hoffe, es gefällt Ihnen. Der nächste Artikel stellt Ihnen die Integrationsmethode von Spring und Mybatis vor.