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>
我们知道要使用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接口。
使用MyBatis-Spring,你不再需要直接使用SqlSessionFactory,因为你的bean可以通过一个线程安全的SqlSession来注入,基于Spring的事务配置来自动提交、回滚、关闭session。下面两个是手动使用SqlSessionDaoSupport或SQLSessionTemplate编写数据访问对象(DAO)。
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是一个抽象的支持类,用来为你通过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类可以让你直接注入数据映射器接口到你的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);
}
}
没有必要再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