都知道spring之后通过Spring的@Transactional注解开启事务的。但是在没学spring之前,mybatis用jdbc的事务开启。今天在学习mybatis的时候,因为数据库的 (insert、update、delete),必须调用session.commit()方法,所做的修改才能持久化到磁盘。
@Test
public void test2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Map map = new HashMap();
map.put("id","2cdd1853d0d5405f8132fe7446ebb6c9");
map.put("title","Java真不错1");
int i= mapper.updateBlog(map);
sqlSession.commit();//提交事务
sqlSession.close();
System.out.println(i);
}
我遇到的问题就是插入和修改之后,我当时没有commit()提交事务,数据库没有更新。按理说应该是可以自动提交的。
当时我的mybatis-config.xml里面使用的是JDBC的事务管理类型。
<environments default="development">
<environment id="development">
<!-- <transactionManager type="MANAGED"/>-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
我的mybatis工具类创建sqlSession的时候;openSession()没有加参数true
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
//第一步,获取sqlSessionFactory对象
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//有了SqlSessionFactory ,从中获得 SqlSession 的实例了。
// SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
在测试的时候,没有提交事务:发现没有自动提交事务。
@Test
public void test2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Map map = new HashMap();
map.put("id","2cdd1853d0d5405f8132fe7446ebb6c9");
map.put("title","Java真不错1");
int i= mapper.updateBlog(map);
//sqlSession.commit();//提交事务
sqlSession.close();
System.out.println(i);
}
看着代码按理来说,应该是自动提交的。那为什么会这样子呢?查看日志,发现执行sql前先把自动提交关闭了,之后又打开了。
所以通过不断测试,有三种开启自动提交的方法。有时候也会忘记提交,所以可以开启自动提交事务。
三种开启mybatis自动提交事务
方法1、配置文件mybatis-config.xml
不用JDBC的事务管理器,即可开启自动提交。
其实是因为使用JDBC的事务管理器的时候,它会把自动提交先关闭一下。应该是版本问题,我我这边必须选一个。
方法二、工厂创建sqlSession实例时加参数"true"
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
return sqlSession;
}
方法三:获得连接,手动setAutoCommit为true
这个方法应该在学习JDBC事务的时候会学到。
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionFactory.openSession();
Connection connection = sqlSession.getConnection();
try {
connection.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
return sqlSession;
}
亲测,上述三种方法都有效可以自动开启事务。底层还是没有去细挖了。