目录
一、简介
1、什么是 MyBatis-Spring?
2、知识基础
二、快速入门
三、整合实现①(SqlSessionTemplate)
四、整合实现②(SqlSessionDaoSupport)
五、事务
容器管理事务
编程式事务管理
六、使用SQLSession
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession
并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException
。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
在开始使用 MyBatis-Spring 之前,你需要先熟悉 Spring 和 MyBatis 这两个框架和有关它们的术语。
MyBatis-Spring 需要以下版本:
MyBatis-Spring | MyBatis | Spring 框架 | Spring Batch | Java |
---|---|---|---|---|
2.0 | 3.5+ | 5.0+ | 4.0+ | Java 8+ |
1.3 | 3.4+ | 3.2.2+ | 2.1+ | Java 6+ |
在 pom.xml 中导入依赖:
org.mybatis
mybatis-spring
2.0.2
要和 Spring 一起使用 MyBatis,需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory
和至少一个数据映射器类。
在 MyBatis-Spring 中,可使用 SqlSessionFactoryBean
来创建 SqlSessionFactory
。 只需要把下面代码放在 Spring 的 XML 配置文件中,这里需要一个DataSource(数据源):
假如定义了一个如下的mapper接口:
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{userId}")
User getUser(@Param("userId") String userId);
}
可以通过MapperFactoryBean,把接口加入到Spring中:
注意:所指定的映射器类必须是一个接口,而不是具体的实现类,上面例子用的是注解,也可以用xml配置的形式。
配置好之后,就可以像 Spring 中普通的 bean 注入方法那样直接注入映射器到 service 对象中。MapperFactoryBean 处理 SqlSession 的创建和关闭它。如果使用 了 Spring 的事务,那么当事务完成时,session 将会提交或回滚。最终,任何异常都会被翻 译成 Spring 的 DataAccessException 异常。
最后调用Mybatis数据方法只需一行代码:
public class UserServiceImpl implements UserService {
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User findUserById(String userId) {
return this.userMapper.getUser(userId);
}
MapperFactoryBean:这个类可以让你直接注入数据映射器接口到你的 service层bean 中。当使用映射器时,就像调用你的DAO一样调用它们就可以了。
SqlSessionTemplate 是 MyBatis-Spring 的核心。
它负责管理 MyBatis 的 SqlSession, 调用 MyBatis 的 SQL 方法, 翻译异常。 SqlSessionTemplate 是线程安全的, 可以被多个 DAO 所共享使用。它管理 session 的生命 周期,包含必要的关闭,提交或回滚操作。
SqlSessionTemplate 实现了 SqlSession 接口,在代码中无需对 MyBatis 的 SqlSession 替换。SqlSessionTemplate 通常是被用来替代默认的 MyBatis 实现的 DefaultSqlSession。
SqlSessionDaoSupport 需要一个 sqlSessionFactory 或 sqlSessionTemplate 属性来 设 置 。
1、引入Spring配置文件beans.xml
2、配置数据源替换mybaits的数据源
3、配置SqlSessionFactory,关联MyBatis
4、注册sqlSessionTemplate,关联sqlSessionFactory
5、增加Dao接口的实现类;私有化sqlSessionTemplate
public class UserDaoImpl implements UserMapper {
//sqlSession不用我们自己创建了,Spring来管理
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List selectUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
6、注册bean实现
7、测试
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserMapper mapper = (UserMapper) context.getBean("userDao");
List user = mapper.selectUser();
System.out.println(user);
}
结果成功输出!现在我们的Mybatis配置文件的状态!发现都可以被Spring整合
SqlSessionDaoSupport 是 一 个 抽象 的支 持 类, 用来 为你 提供 SqlSession,调用getSqlSession()方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法。
mybatis-spring1.2.3版以上才能使用此实现
dao继承Support类,直接利用getSqlSession()获得,然后直接注入SqlSessionFactory。比起第一种方式,此方式不需要管理SqlSessionTemplate,而且对事务的支持更加友好
1、将我们上面写的UserDaoImpl修改一下
public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {
public List selectUser() {
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
return mapper.selectUser();
}
}
2、修改bean的配置
3、测试
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserMapper mapper = (UserMapper) context.getBean("userDao");
List user = mapper.selectUser();
System.out.println(user);
}
一个使用 MyBatis-Spring 的主要原因是它允许 MyBatis 参与到 Spring 的事务管理中。MyBatis-Spring 利用了存在于 Spring 中的 DataSourceTransactionManager。
配置了Spring的事务管理器之后,就可以在Spring中配置事务。并且支持@Transactional
注解和AOP风格的配置。在事务处理期间,一个单独的SqlSession
对象将会被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚。
首先开启Spring事务处理功能,创建一个 DataSourceTransactionManager对象。
注意,:为事务管理器指定的 DataSource必须和用来创建 SqlSessionFactoryBean的是同一个数据源,否则事务管理器就无法工作了。
如果你想让 Spring 参与到容器管理事务(CMT)中,那么 Spring 应该使用JtaTransactionManager 或它的容器指定的子类来配置
如果你想使用CMT,而不想使用Spring的事务管理。必须配置SQLSessionFactory来使用MyBatis 的 ManagedTransactionFactory
MyBatis 的 SqlSession
提供几个方法来在代码中处理事务。但是你不能在 Spring 管理的SqlSession
上调用SqlSession.commit()
,SqlSession.rollback()
或 SqlSession.close()
方法。如果这样做了,就会抛出 UnsupportedOperationException
异常。
如果你想编程式地控制事务,这段代码展示了使用 PlatformTransactionManager 来处理事务
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try {
userMapper.insertUser(user);
}
catch (MyException ex) {
txManager.rollback(status);
throw ex;
}
txManager.commit(status);
在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时 候, 你可以关闭 session。 使用 MyBatis-Spring 之后, 你不再需要直接使用 SqlSessionFactory 了,因为你的 bean 可以通过一个线程安全的 SqlSession 来注入,基于 Spring 的事务配置 来自动提交,回滚,关闭 session。