场景
单独使用myBatis进行测试时,进行增删改查,进行查询时正常显示,但是进行插入、修改、删除时数据库中总是没法修改,查看控制台输出:
原因
默认情况下,事务不是自动提交
查看Mybatis的opensession()源码
可以看到有好多重载方法,其中带参数 paramBoolean 是boolean类型的,此参数默认为false,是不会自动提交事务。
工具类
查看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,使其自动提交。
再次执行插入后就会提示:
然后查看数据库就已经插入数据了。