MyBatis缓存

MyBatis一级缓存

MyBatis中的一级缓存是默认开启的,它是sqlSession级别的缓存,一个sqlSession会话的查询操作保存在缓存中,之后的相同查询直接从缓存中获取。当执行insert、update、delete语句时,会清空一级缓存。
一级缓存没有过期时间,不会自动清空,只有在执行更新操作后或者关闭sqlSession会话时才会清空。

    @Test
    public void test01() throws Exception{
        init();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        // 第一次查询
        List<Employee> emps1 = mapper.selectEmployeeList();
        // 第二次查询
        List<Employee> emps2 = mapper.selectEmployeeList();
        System.out.println(emps1 == emps2);
        session.close();
        // 关闭会话后重新查询
        session = factory.openSession();
        mapper = session.getMapper(EmployeeMapper.class);
        List<Employee> emps3 = mapper.selectEmployeeList();
        System.out.println(emps1 == emps3);
        session.close();
    }
    @Test
    public void test02() throws Exception{
        init();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        // 第一次查询
        List<Employee> emps1 = mapper.selectEmployeeList();
        // 执行更新操作
        Employee employee = new Employee();
        employee.setId(10);
        employee.setName("张三");
        mapper.updateEmployee(employee);
        // 第二次查询
        List<Employee> emps2 = mapper.selectEmployeeList();
        System.out.println(emps1 == emps2);
        session.close();
    }

MyBatis二级缓存

二级缓存需要手动开启,它属于sqlSessionFactory级别的缓存,也就是所有的sqlSession可以共享。一个会话执行查询操作后会先放入一级缓存,等到该会话关闭时才会将一级缓存的数据刷新到二级缓存中。每次查询时会先从二级缓存中获取数据,找不到再去一级缓存中找。
二级缓存的过期时间默认是1个小时,到期后会自动清空。

    @Test
    public void test03() throws Exception{
        init();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        // 第一次查询
        List<Employee> emps1 = mapper.selectEmployeeList();
        session.close();
        // 关闭会话后重新查询
        session = factory.openSession();
        mapper = session.getMapper(EmployeeMapper.class);
        // 第二次查询
        List<Employee> emps2 = mapper.selectEmployeeList();
        session.close();
    }

只执行了一次查询,第二个会话命中二级缓存。

    @Test
    public void test04() throws Exception{
        init();
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        // 第一次查询
        List<Employee> emps1 = mapper.selectEmployeeList();
        session.close();
        // 关闭会话后更新
        session = factory.openSession();
        mapper = session.getMapper(EmployeeMapper.class);
        // 执行更新操作
        Employee employee = new Employee();
        employee.setId(10);
        employee.setName("张三");
        mapper.updateEmployee(employee);
        session.commit();
        session.close();
        // 再次查询
        session = factory.openSession();
        mapper = session.getMapper(EmployeeMapper.class);
        // 第二次查询
        List<Employee> emps2 = mapper.selectEmployeeList();
        session.close();
    }

中途更新操作刷新二级缓存。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值