1、mybatis-spring.jar简介
Spring与Mybatis整合需要引入一个mybatis-spring.jar文件包,该整合包由Mybatis提供,可以从Mybatis官网下载。
mybatis-spring.jar提供了下面几个与整合相关的API
SqlSessionFactoryBean
为整合应用提供SqlSession对象资源
MapperFactoryBean
根据指定Mapper接口生成Bean实例
MapperScannerConfigurer
根据指定包批量扫描Mapper接口并生成实例
2、SqlSessionFactoryBean
在单独使用Mybatis时,所有的操作都是围绕SqlSession展开的,SqlSession是通过SqlSessionFactory获取的,SqlSessionFactory又是通过SqlSessionFactoryBuilder创建生成。
在Spring和Mybatis整合应用时,同样需要SqlSession,mybatis-spring.jar提供了一个SqlSessionFactoryBean生成SqlSessionFactory对象,为整合应用提供SqlSession对象。
SqlSessionFactoryBean在applicationContext.xml中定义格式如下
<!--SqlSessionFactoryBean的配置--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--指定连接资源--> <property name="dataSource" ref="myDataSource" /> <!--指定映射文件--> <property name="mapperLocations" value="classpath:org/tarena/entity/*.xml" /> </bean>
3、MapperFactoryBean
MapperFactoryBean作用是根据Mapper接口获取我们想要的Mapper对象,它封装了原有的session.getMapper()功能实现。
在定义MapperFactoryBean时,需要注入以下两个属性
一个是SqlSessionFactoryBean对象,用于提供SqlSession
一个是要返回Mapper对象的Mapper接口
MapperFactoryBean在applicationContext.xml中定义格式如下
<!--MapperFactoryBean的配置--> <bean id="deptMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <!--指定Mapper接口--> <property name="mapperInterface" value="org.tarena.mapper.DeptMapper" /> <!--指定SqlSessionFactoryBean对象--> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
4、MapperScannerConfigurer
在使用MapperFactoryBean时,有一个Mapper就需要定义一个对应的MapperFactoryBean。当Mapper比较少时可以,但遇到大量Mapper时就需要使用mybatis-spring.jar提供的MapperScannerConfigurer组件,通过这个组件会自动扫描各个Mapper接口,并注册对应的MapperFactoryBean对象
在定义MapperScannerConfigurer时,只需要指定一个basePackage即可。basePackage用于指定Mapper接口所在的包,在这个包及其所有子包下面的Mapper接口都将被搜索到,并把他们注册为一个个MapperFactoryBean对象。多个包之间可以使用逗号或者分号进行分割。
<!--MapperScannerConfigurer配置--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.tarena.mapper"/> </bean>
提示:
sqlSessionFactory属性可以不用指定,会以Autowired方式自动注入
如果指定的某个包下并不完全是我们定义的Mapper接口,此时使用MapperScannerConfigurer的另外两个属性可以缩小搜索范围和注册范围,一个是annotationClass,另一个是markerInterface.
annotationClass:用于指定一个注解标记,当指定了annotationClass时,MapperScannerConfigurer将只注册使用了annotationClass注解标记的接口
markerInterface:用于指定一个接口,当指定了markerInterface时,MapperScannerConfigurer将只注册继承自markerInterface的接口
MapperScannerConfigurer定义示例
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.tarena" /> <property name="annotationClass" value="org.tarena.annotation.MybatisRepository" /> </bean>
上面配置含义:MapperScannerConfigurer自动扫描org.tarena包下所有接口,遇到带@MybatisRepository标记的将对应MapperFactoryBean对象注册
@MybatisRepository自定义注解标记代码如下
public @interface MyBatisRepository{ }
5、SqlSessionTemplate
上述整合完成后,程序可直接使用Spring容器中的Mapper接口实例进行编程。此外mybatis-spring.jar还提供了一个SqlSessionTemplate组件,,也可以将该组件对象注入给程序中的DAO,在DAO中利用SqlSessionTemplate编程。
基于SqlSessionTemplate的DAO示例代码如下
public class MybatisDeptDAO implements DeptDAO { private SqlSessionTemplate template; @Autowired public void setTemplate(SqlSessionTemplate template){ this.template=template; } public List<Dept> findAll(){ List<Dept> list = template.selectList("findAll"); return list; } }
基于SqlSessionTemplate的DAO配置信息如下
<!--定义SqlSessionTemplate--> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate" > <constructor-arg index="0" ref="sqlSessionfactory"> </constructor-arg> </bean> <!--扫描DAO并注入template--> <context:component-scan base-package="org.tarena.dao" /> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--省略 --> </bean>