Spring与Mybatis整合

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>

 

 

  

  

你可能感兴趣的:(mybatis)