0
点赞
收藏
分享

微信扫一扫

测试Mybatis时事务自动回滚,无法完成增删改

凯约 2023-03-13 阅读 139


场景

单独使用myBatis进行测试时,进行增删改查,进行查询时正常显示,但是进行插入、修改、删除时数据库中总是没法修改,查看控制台输出:

测试Mybatis时事务自动回滚,无法完成增删改_sql

原因

默认情况下,事务不是自动提交

查看Mybatis的opensession()源码

可以看到有好多重载方法,其中带参数 paramBoolean 是boolean类型的,此参数默认为false,是不会自动提交事务。

测试Mybatis时事务自动回滚,无法完成增删改_sql_02

工具类

查看opensession()所在的工具类SqlSessionFactoryUtils.java

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import com.learn.ssm.chapter3.mapper.RoleMapper;
import com.learn.ssm.chapter3.mapper.RoleMapper2;
import com.learn.ssm.chapter3.pojo.Role;

public class SqlSessionFactoryUtils {

private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class;

private static SqlSessionFactory sqlSessionFactory = null;

private SqlSessionFactoryUtils() {
}

public static SqlSessionFactory getSqlSessionFactory() {
synchronized (LOCK) {
if (sqlSessionFactory != null) {
return sqlSessionFactory;
}
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
return null;
}
return sqlSessionFactory;
}
}


public static SqlSession openSqlSession() {
if (sqlSessionFactory == null) {
getSqlSessionFactory();
}
return sqlSessionFactory.openSession();
}
}

可以看到是没有传递参数的,所以默认是不会自动提交事务的。

解决

将工具类中的opensession()方法中传递参数true,使其自动提交。

测试Mybatis时事务自动回滚,无法完成增删改_apache_03

再次执行插入后就会提示:

测试Mybatis时事务自动回滚,无法完成增删改_apache_04

 

然后查看数据库就已经插入数据了。

举报

相关推荐

0 条评论