MyBatis-Spring整合

MyBatis-Spring会帮助你将MyBatis代码无缝地整合到Spring中。

开始

要使用MyBatis-Spring模块,需要的jar: mybatis-spring-x.x.x.jar。或者用maven:(以1.3.1为例)

    <dependency>
        <groupId>org.mybatisgroupId>
        <artifactId>mybatis-springartifactId>
        <version>1.3.1version>
    dependency>

创建SqlSessionFactory

我们知道要使用MyBatis,需要SqlSession,而SqlSession是由SqlSessionFactory创建的,在基本的MyBatis中,SQLSessionFactory是由SQLSessionFactoryBuilder创建,而在MyBatis-Spring中,使用SQLSessionFactoryBean来替代:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath*:sample/config.xml"/>
        <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml"/>
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <property name="mapUnderscoreToCamelCase" value="true"/>
            bean>
        property>
    bean>

看这里的FactoryBean,是的,SQLSessionFactoryBean实现了Spring的FactoryBean接口。

使用SqlSession

使用MyBatis-Spring,你不再需要直接使用SqlSessionFactory,因为你的bean可以通过一个线程安全的SqlSession来注入,基于Spring的事务配置来自动提交、回滚、关闭session。下面两个是手动使用SqlSessionDaoSupport或SQLSessionTemplate编写数据访问对象(DAO)。

SqlSessionTemplate

SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法、翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。SqlSessionTemplate对象可以使用SqlSessionFactory作为构造方法的参数来创建。

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    bean>

示例:

public class DaoImpl implements Dao{

    @Autowired
    private SqlSession sqlSession;

    @Override
    public User getUser(String userId) {
        return sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
    }
}

SqlSessionTemplate有一个使用ExecutorType作为参数的构造方法。允许你用来创建对象。比如批量SqlSession

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
        <constructor-arg index="1" value="BATCH"/>
    bean>

使用代码:

public void insertUsers(User[] users) {
        for(User user : users){
            sqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser", user);
        }
    }

SqlSessionDaoSupport

SqlSessionDaoSupport是一个抽象的支持类,用来为你通过SqlSession。调用getSqlSession()方法你会得到一个SqlSessionTemplate之后可以用于执行SQL方法:

public class DaoImpl extends SqlSessionDaoSupport implements Dao{

    @Override
    public User getUser(String userId) {
        return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
    }
}

配置

id="testDao" class="demo.mybatis.config.DaoImpl">
        <property name="sqlSessionFactory" red="sqlSessionFactory"/>
    

注入映射器

MapperFactoryBean

MapperFactoryBean类可以让你直接注入数据映射器接口到你的service层bean中。当使用映射器时,你仅仅如调用你的DAO一样调用它们就可以了,但是你不需要编写任何DAO实现的代码,因为MyBatis-Sping将会为你创建代理。
数据映射器接口可以按照如下做法加入到Spring中。

id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
public interface UserMapper {
  @Select("SELECT * FROM users WHERE id = #{userId}")
  User getUser(@Param("userId") String userId);
} 

MapperFactoryBean创建的代理类实现了UserMapper接口,并且注入到应用程序中。因为代理创建在运行时环境中,指定的映射器必须是一个接口,不是一个具体的实现类。
在应用中使用:

public class FooServiceImpl implements FooService {
 @AutoWrite
  private UserMapper userMapper;

  public User doSomeBusinessStuff(String userId) {
    return this.userMapper.getUser(userId);
  }
}

MapperScannerConfigurer

没有必要再Spring的XML配置文件中注册所有的映射器。相反,你可以使用一个MapperScannerConfigurer ,他将会查找类路径下的映射器并自动将他们创建成MapperFactoryBean。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
bean>

事务管理

一个使用MyBatis-Spring的主要原因是它允许MyBatis参与到Spring的事务管理中。而不是给MyBatis创建一个新的特定的事务管理器,MyBatis-Spring利用了存在于Spring的DataSourceTransactionManager。一旦Spring的PlatformTransactionManager 配置好了,你可以在Spring中以你通常的做法来配置事务。@Transcational注解和AOP样式的配置都是支持的。在事务处理期间,一个单独的SqlSession对象将会被创建和使用。当事务完成时,这个session会以合适的方式提交或回滚。

标准配置

id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />

容器管理事务

如果想使用CMT,而不是使用Spring的事务管理,你就必须配置SqlSessionFactory来使用基本的MyBatis的ManagedTransactionFactory而不是其他任意的Spring事务管理器:

id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="transactionFactory">
    class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
  property>  

结束
如果您想了解更多关于MyBatis-Spring的功能,去看官方文档呗:http://www.mybatis.org/spring/zh/index.html

你可能感兴趣的:(持久层框架)