作者也是今天才发现这个问题,比如这个,自己一开始都是查询,但是最后一次明显计时修改信息,控制台为报错,并且显示正确,但是数据库中什么都没改
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()
这里作者修改之后,在看数据库的信息时,就可以发现数据已经改变了

