Согласно официальному заявлению, работа по разработке Spring3 была завершена до появления ibatis3, то есть Mybatis3, поэтому поддержки Mybatis3 в Spring3 до сих пор нет. Поэтому сообщество Mybatis разработало Mybatis-Spring, чтобы удовлетворить потребности пользователей Mybatis в интеграции Spring. Ниже будет дано краткое введение в использование интеграции Mybatis и Spring через Mybatis-Spring.
MapperFactoryBean
Во-первых, нам нужно загрузить jar-пакет Mybatis-Spring с официального сайта 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" / > <property name="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 >
плагины: тип массива, используемый для указания перехватчика Mybatis.
typeHandlersPackage: используется для указания пакета, в котором находится TypeHandler. Если этот атрибут указан, SqlSessionFactoryBean автоматически зарегистрирует классы в пакете как соответствующий TypeHandler. Несколько пакетов могут быть разделены запятыми или точками с запятой.
typeHandlers: тип массива, представляющий TypeHandler.
Следующий шаг — определить MapperFactoryBean, соответствующий объекту Mapper, который нам нужен, в файле applicationContext Spring. Нужный нам объект Mapper можно получить через MapperFactoryBean. MapperFactoryBean реализует интерфейс Spring FactoryBean, поэтому MapperFactoryBean получает соответствующий объект Mapper через метод getObject, определенный в интерфейсе FactoryBean. При определении MapperFactoryBean нам необходимо внедрить два свойства: одно — это sqlSessionFactory, используемое Mybatis-Spring для создания объектов SqlSessionTemplate, реализующих интерфейс SqlSession, другое — соответствующий интерфейс Mapper, который мы хотим вернуть.
После определения MapperFactoryBean, соответствующего соответствующему интерфейсу Mapper, мы можем внедрить соответствующий интерфейс Mapper в объект компонента, управляемый Spring, например объект компонента Service. Таким образом, когда нам нужно использовать соответствующий интерфейс Mapper, MapperFactoryBean получит соответствующий интерфейс Mapper из своего метода getObject, а внутренне getObject по-прежнему вызывает метод getMapper (интерфейс Mapper) интерфейса SqlSession через введенные нами свойства, чтобы вернуть соответствующий интерфейс Mapper. Таким образом, интеграция Mybatis и Spring достигается путем передачи SqlSessionFactory и соответствующего интерфейса Mapper управлению Spring.
Файл конфигурации Spring applicationContext.xml:
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:comComponent-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}" /> <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" /> </ фасоль> фасоль> </фасоль>
Файл BlogMapper.xml:
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"> <!-- Добавить новую запись--> <insert id="insertBlog" параметрType="Блог" useGeneratedKeys="true" keyProperty="id"> вставить в значения t_blog(title,content,owner)(#{title},#{content},#{owner}) </ Insert> <!-- Запрос одной записи--> <select id="selectBlog"parameterType="int" resultMap="BlogResult"> select * from t_blog, где id = #{id} </select> <!-- Изменить запись--> <update id="updateBlog"parameterType="Blog"> update t_blog set title = #{title},content = #{content},owner = #{owner} где id = #{id} </update> <!-- Запросить все записи--> <select id="selectAll" resultType="Blog"> select * from t_blog </select> <!-- Удалить записи --> <delete id="deleteBlog" параметрType="int"> удалить из t_blog, где id = #{id} </delete> </mapper>
БлогМаппер.java:
Java-код
пакет com.tiantian.mybatis.mapper; import java.util.List; import com.tiantian.mybatis.model.Blog; publicinterface BlogMapper {public Blog selectBlog (int id); ); publicvoid deleteBlog(int id); public List<Blog> selectAll();
БлогСервисИмпл.java:
Java-код
пакет com.tiantian.mybatis.service.impl; импорт javax.annotation.Resource; импорт org.springframework.stereotype.Service; импорт com.tiantian.mybatis.mapper.BlogMapper; mybatis.model.Blog; import com.tiantian.mybatis.service.BlogService; @Service publicclass BlogServiceImpl реализует BlogService {частный BlogMapper blogMapper; publicvoid deleteBlog(int id) { blogMapper.deleteBlog(id); } public Blog find(int id) { returnblogMapper.selectBlog(id); } public List<Blog> find() { returnblogMapper.selectAll(); publicvoid InsertBlog(Блог-блог) { blogMapper.insertBlog(блог) } publicvoid updateBlog(Блог-блог) { blogMapper.updateBlog(блог); } public BlogMapper getBlogMapper () { returnblogMapper; } @Resource publicvoid setBlogMapper (BlogMapper blogMapper) { this.blogMapper = blogMapper } }
MapperScannerConfigurer
При использовании описанного выше метода интеграции, если у нас есть Mapper, нам необходимо определить соответствующий MapperFactoryBean. Когда у нас относительно мало Mapper, это нормально, но когда у нас довольно много Mapper, мы определяем каждый Mapper следующим образом. соответствующий MapperFactoryBean работает медленнее. Для этой цели Mybatis-Spring предоставляет нам класс MapperScannerConfigurer. С помощью этого класса Mybatis-Spring автоматически зарегистрирует для нас объект MapperFactoryBean, соответствующий Mapper.
Если нам нужно использовать MapperScannerConfigurer для автоматического сканирования и регистрации интерфейса Mapper, нам нужно определить bean-компонент, соответствующий MapperScannerConfigurer, в файле конфигурации applicationContext Spring. Для MapperScannerConfigurer мы должны указать один атрибут — basePackage. basePackage используется для указания базового пакета, в котором находится файл интерфейса Mapper. Будет выполняться поиск интерфейсов Mapper в этом базовом пакете или во всех его подпакетах. Несколько базовых пакетов можно разделять запятыми или точками с запятой. Простейшее определение MapperScannerConfigurer — указать только один атрибут basePackage, например:
XML-код
<bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> </bean>
Таким образом, MapperScannerConfigurer просканирует все интерфейсы указанного базового пакета и зарегистрирует их как объекты MapperFactoryBean. При использовании MapperScannerConfigurer и добавлении атрибута basePackage файл конфигурации applicationContext в нашем примере выше будет выглядеть следующим образом:
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:comComponent-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}" /> <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>
Иногда указанный нами базовый пакет не включает все определенные нами интерфейсы Mapper. По этой причине MapperScannerConfigurer также предоставляет нам два других атрибута, которые могут сузить область поиска и регистрации. Один из них — annotationClass, а другой —markerInterface.
annotationClass: если указан annotationClass, MapperScannerConfigurer будет регистрировать только интерфейсы, отмеченные аннотацией annotationClass.
маркерИнтерфейс: маркерИнтерфейс используется для указания интерфейса. Если указан маркерИнтерфейс, MapperScannerConfigurer регистрирует только интерфейс, унаследованный от маркераИнтерфейс.
Если указаны оба вышеуказанных свойства, MapperScannerConfigurer воспользуется их объединением вместо их пересечения. Даже если для маркировки используется annotationClass или интерфейс, унаследованный от маркерного интерфейса, будет зарегистрирован как MapperFactoryBean.
Теперь предположив, что наш интерфейс Mapper наследует интерфейс SuperMapper, мы можем определить наш MapperScannerConfigurer следующим образом.
XML-код
<bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> <property name="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/> </bean>
Если используется тег аннотации MybatisMapper, мы можем определить наш MapperScannerConfigurer следующим образом.
XML-код
<bean> <property name="basePackage" value="com.tiantian.mybatis.mapper" /> <property name="annotationClass" value="com.tiantian.mybatis.annotation.MybatisMapper"/> </bean>
В дополнение к свойствам, используемым для сужения области действия зарегистрированного интерфейса Mapper, мы также можем указать некоторые другие свойства, такие как:
sqlSessionFactory: это свойство устарело. Когда мы используем несколько источников данных, нам нужно использовать sqlSessionFactory, чтобы указать SqlSessionFactory, который необходимо использовать при регистрации MapperFactoryBean, поскольку, если sqlSessionFactory не указан, он будет автоматически внедрен методом Autowired. Другими словами, когда мы используем только один источник данных, то есть когда мы определяем только одну SqlSessionFactory, нам не нужно указывать SqlSessionFactory для MapperScannerConfigurer.
sqlSessionFactoryBeanName: его функция аналогична функции sqlSessionFactory, за исключением того, что она определяет имя компонента, соответствующее определенному SqlSessionFactory.
sqlSessionTemplate: этот атрибут устарел. Его функция также эквивалентна sqlSessionFactory, поскольку, как упоминалось ранее, MapperFactoryBean в конечном итоге использует метод getMapper класса SqlSession для получения соответствующего объекта Mapper. Его необходимо указывать только в том случае, если определено несколько SqlSessionTemplates. Для MapperFactoryBean требуется только один из SqlSessionFactory и SqlSessionTemplate. Если указаны оба, SqlSessionFactory будет игнорироваться.
sqlSessionTemplateBeanName: укажите имя компонента, соответствующее используемому шаблону sqlSessionTemplate.
Примечание. Поскольку использование атрибутов sqlSessionFactory и sqlSessionTemplate приведет к загрузке некоторого содержимого до PropertyPlaceholderConfigurer, информация о внешних свойствах, используемая в файле конфигурации, не может быть заменена вовремя, и возникнут ошибки. Свойства sqlSessionFactory и sqlSessionTemplate исключены из Mybatis-Spring. Рекомендуется использовать свойство sqlSessionFactoryBeanName и свойство sqlSessionTemplateBeanName.
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:comComponent-scan base-package="com.tiantian.mybatis" /> <context:property-placeholder location= "classpath:config/jdbc.properties" /> <bean id="dataSource" уничтожить-метод="закрыть"> <имя свойства="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
Помимо использования интерфейса Mapper непосредственно после описанной выше интеграции, Mybatis-Spring также предоставляет нам возможность напрямую использовать SqlSession. Mybatis-Spring предоставляет нам класс SqlSessionTemplate, который реализует интерфейс SqlSession. Он потокобезопасен и может использоваться несколькими Dao одновременно. В то же время он также связан с транзакцией Spring, чтобы гарантировать, что используемый в данный момент SqlSession привязан к транзакции Spring. И он также может самостоятельно управлять отправкой и закрытием сеанса. Когда используется механизм управления транзакциями Spring, SqlSession также можно отправлять и откатывать вместе с транзакциями Spring.
При использовании SqlSessionTemplate мы можем определить его в файле конфигурации applicationContext Spring следующим образом:
<bean id="sqlSession"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean>
Таким образом, мы можем напрямую использовать SqlSessionTemplate для программирования в Dao посредством внедрения зависимостей Spring. На данный момент наш Dao может выглядеть так:
Java-код
пакет com.tiantian.mybatis.dao; импорт javax.annotation.Resource; импорт org.mybatis.spring.SqlSessionTemplate; импорт org.springframework.stereotype.Repository; Блог; @Repository publicclass BlogDaoImpl реализует BlogDao {частный 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(блог блога) { this.sqlSessionTemplate.update("com.tiantian.mybatis.mapper.BlogMapper.updateBlog", блог } public SqlSessionTemplate getSqlSessionTemplate() { returnsqlSessionTemplate; } @Resource publicvoid setSqlSessionTemplate(SqlSessionTemplate) sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate } };
Примечание:
Эта статья написана на основе Mybatis3.2.1, Mybatis-Spring1.1.0 и Spring3.1.
Выше приведен краткий анализ процесса реализации интеграции mybatis и Spring, представленного в этой статье. Надеюсь, она вам понравится. Следующая статья познакомит вас с методом интеграции Spring и Mybatis.