MyBatis·基础篇(九) MyBatis的事务控制
1. JDBC中事务的回顾
在 JDBC 中我们可以通过手动方式将事务的提交改为手动方式,通过 setAutoCommit()方法就可以调整。
那么我们的 Mybatis 框架因为是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC 的setAutoCommit()方法来设置事务提交方式的。
2. 配置事务管理器
修改 SqlMapConfig.xml
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"></transactionManager>
支持两种类型:
* JDBC:使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等
* MANAGED:使用MANAGED的事务管理机制:这种机制MyBatis自身不会去实现事务管理,而是让程序的WEB容器如(JBOSS,Weblogic)来实现对事务的管理
3. Mybatis 中事务提交方式
Mybatis 中事务的提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制。
运行之前源码:
/**
* @author: LzCc
* @blog: https://blog.csdn.net/qq_41744145
* @description: 测试类
*/
public class Test {
private InputStream in;
private SqlSessionFactory factory;
private SqlSession session;
private UserMapper userMapper;
public void testSaveUser() throws Exception {
User user = new User();
user.setUsername("周杰伦");
//6.执行操作
int res = userMapper.saveUser(user);
System.out.println(res);
System.out.println(user.getId());
}
@Before//在测试方法执行之前执行
public void init()throws Exception {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.创建 SqlSession 工厂对象
factory = builder.build(in);
//4.创建 SqlSession 对象
session = factory.openSession();
//5.创建 Dao 的代理对象
userMapper = session.getMapper(UserMapper.class);
}
@After//在测试方法执行完成之后执行
public void destroy() throws Exception{
//7.提交事务
session.commit();
//8.释放资源
session.close();
in.close();
}
}
观察控制台输出的结果:
打开JDBC连接
创建连接对象
设置自动事务为 false 到JDBC连接
提交事务
重新设置自动提交事务
关闭JDBC连接
归还连接池
这是我们的 Connection 的整个变化过程,通过分析我们能够发现之前的 CUD 操作过程中,我们都要手动进行事务的提交,原因是 setAutoCommit()方法,在执行时它的值被设置为 false 了,所以我们在 CUD 操作中,必须通过 sqlSession.commit()方法来执行提交操作。
4. MyBatis 设置自动提交事务
通过上面我们知道,从连接池取出连接时都会将自动事务设置为 false ,这样我们就必须使用 sqlSession.commit() 方法,相当于使用了 JDBC 中的 connection.commit() 方法实现事务提交。
那么我们如何设置自动提交事务呢?
//4.创建 SqlSession 对象
session = factory.openSession(true);
我们只需要在调用 openSession 方式时传入参数 true
再次运行测试类,控制台输出如下:
在数据库获取连接时并没有设置自动事务为 false 了
也没有显示提交事务,因为事务自动提交了
简单了解下Mybatis中的事务控制,今后在项目中都会整合Spring,通过Spring框架来管理事务