作者也是今天才发现这个问题,比如这个,自己一开始都是查询,但是最后一次明显计时修改信息,控制台为报错,并且显示正确,但是数据库中什么都没改
public class TestOneLevelCache {
public static void testCache1() {
SqlSession session = MyBatisUtil.getSqlSession();
String statement = "me.gacl.mapping.userMapper.getUser";
User user = session.selectOne(statement, 1);
System.out.println(user);
/*
* 一级缓存默认就会被使用
*/
user = session.selectOne(statement, 1);
System.out.println(user);
session.close();
/*
1. 必须是同一个Session,如果session对象已经close()过了就不可能用了
*/
session = MyBatisUtil.getSqlSession();
user = session.selectOne(statement, 1);
System.out.println(user);
/*
2. 查询条件是一样的
*/
user = session.selectOne(statement, 2);
System.out.println(user);
/*
3. 没有执行过session.clearCache()清理缓存
*/
//session.clearCache();
user = session.selectOne(statement, 2);
System.out.println(user);
/*
4. 没有执行过增删改的操作(这些操作都会清理缓存)
*/
session.update("me.gacl.mapping.userMapper.updateUser",
new User(2, "user", 23));
user = session.selectOne(statement, 2);
System.out.println(user);
}
public static void main(String[] args) {
testCache1();
}
}
数据没有变化
之后自己查了查,发现mybatis其实不是自动提交事务的,而是需要自己主动提交事务的,
我们之所以能看到控制台查询正确是因为是刚从缓存里面取出来的,所以是正确的,而且作者今天刚好在学的就是缓存这一块的
其次就是解决办法,有两种
第一种
我们之前使用的都是SqlSessionFactory.openSession()这个方法来打开sqlsession对象,这其中就是属于没有设置他的自动提交属性可以通过如下代码实现
public static SqlSession getSqlSession(boolean isAutoCommit) {
return getSqlSessionFactory().openSession(isAutoCommit);
}
然后设置里面的isAutoCommit=true,就行了
说是实话,这个方法之前在大神的比克学习的时候就看到了,但是自己当初就没有理解,因为但是使用的方法都是SqlSessionFactory.openSession(),如今才知道了这里的真谛。
第二种
就是直接在最后的代码后面就上这句话即可
sqlSession.commit()
这里作者修改之后,在看数据库的信息时,就可以发现数据已经改变了