Mybatis学习笔记(五)Mybatis中已经显示数据已修改但数据库中记录未更新问题

时间:2022-07-23
本文章向大家介绍Mybatis学习笔记(五)Mybatis中已经显示数据已修改但数据库中记录未更新问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

作者也是今天才发现这个问题,比如这个,自己一开始都是查询,但是最后一次明显计时修改信息,控制台为报错,并且显示正确,但是数据库中什么都没改

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()

这里作者修改之后,在看数据库的信息时,就可以发现数据已经改变了