MyBatis学习14之一级缓存

一、sqlSession相同,查询同一个id

1.在测试类中写测试方法。

//一级缓存
    //1.sqlsession相同,查询同一个id
    @Test
    public void testQueryUserByIdf() {
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.findUserByid(1);
        User user1 = mapper.findUserByid(1);
        System.out.println(user == user1);
        sqlSession.close();
    }

2.返回结果

在这里插入图片描述

3.结论

  1. 一级缓存是SqlSession级别的缓存,是一直开启的,我们关闭不了它。
  2. 一级缓存失效情况:没有使用到当前的一级缓存,效果就是,还需要再向数据库中发起一次查询请求!

二、sqlSession不同,查询相同

1.编写测试方法

 //2.sqlSession不同,查询相同
    @Test
    public void testQueryUserById1() {
        SqlSession session = factory.openSession();
        SqlSession session2 = factory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);
        UserMapper mapper2 = session2.getMapper(UserMapper.class);

        User user = mapper.findUserByid(25);
        System.out.println(user);
        User user2 = mapper2.findUserByid(25);
        System.out.println(user2);
        System.out.println(user == user2);
        session.close();
        session2.close();
//      结论:发送了两条SQL语句
//      每个sqlSession中的缓存相互独立
    }

2.返回结果

在这里插入图片描述
在这里插入图片描述

3.结论

发送了两条SQL语句, 每个sqlSession中的缓存相互独立

三、sqlSession相同,查询不同

1.测试代码部分

@Test
    public void testQueryUserById2() {
        SqlSession session = factory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);
        UserMapper mapper2 = session.getMapper(UserMapper.class);

        User user = mapper.findUserByid(1);
        System.out.println(user);
        User user2 = mapper2.findUserByid(2);
        System.out.println(user2);
        System.out.println(user == user2);
        session.close();

    }

2.返回结果

在这里插入图片描述
在这里插入图片描述

2.结论

  1. 观察结果:发现发送了两条SQL语句!
  2. 结论:当前缓存中,不存在这个数据

四、sqlSession相同,两次查询之间执行了增删查改操作

1.代码部分

@Test
    public void testQueryUserById() {
        SqlSession session = factory.openSession();
        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = mapper.findUserByid(27);
        System.out.println(user);


        User useren = new User();
        useren.setUsername("张鑫新");
        useren.setBirthday("2003");
        useren.setSex("男");

        Integer integer = mapper.updateByUserID(useren);
        System.out.println(integer);
        User user2 = mapper.findUserByid(1);
        System.out.println(user2);

        System.out.println(user==user2);
        session.close();
    }

2、返回结果

在这里插入图片描述
在这里插入图片描述

  1. 结论

观察结果:查询在中间执行了增删查改操作后,重新执行了

结论:因为在增删查改操作可能会对当前数据产生影响,sqlSession相同,手动清楚一级缓存

五、sqlSession相同,手动清楚一级缓存

1.代码部分

 //sqlSession相同,手动清楚一级缓存
    @Test
    public void testQueryUserById4() {
        SqlSession session = factory.openSession();
        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = mapper.findUserByid(1);
        System.out.println(user);

        session.clearCache();//手动清楚一级缓存

        User user2 = mapper.findUserByid(1);
        System.out.println(user2);

        System.out.println(user==user2);

        session.close();
    }

2.返回结果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值