1. @Test
  2. public void testQueryUserById(){
  3. SqlSession session = MybatisUtils.getSession();
  4. UserMapper mapper = session.getMapper(UserMapper.class);
  5. User user = mapper.queryUserById(1);
  6. System.out.println(user);
  7. System.out.println("====================================================");
  8. User user2 = mapper.queryUserById(1);
  9. System.out.println(user2);
  10. System.out.println(user==user2);
  11. session.close();

查询同一个数据两次时第二次查询时没有去查询数据库,而是直接从连接池取出数据
捕获4.PNG
这就是一级缓存,一级缓存时sqlSession级别的缓存,随着其关闭才会关闭
同一个sqlSession下才能缓存并读取数据,不同sqlSession则不能
增删改操作可能会对当前数据产生影响,从而刷新缓存

可以手动清除缓存

  1. session.clearCache();//手动清除缓存

Mybatis缓存

  • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。

  • MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存

  • 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)

  • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。

  • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存

二级缓存

二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
是基于namespace级别的缓存,一个名称空间,对应一个二级缓存;

工作机制

  • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;

  • 如果当前会话关闭了,这个会话对应的一级缓存就没了;会话关闭了,一级缓存中的数据被保存到二级缓存中;

  • 新的会话查询信息,就可以从二级缓存中获取内容;

  • 不同的mapper查出的数据会放在自己对应的缓存(map)中;

在核心配置文件中开启

  1. <settings>
  2. <setting name="logImpl" value="STDOUT_LOGGING"/>
  3. <!--开启全局缓存-->
  4. <!-- <setting name="cacheEnabled" value="true"/>-->
  5. </settings>

在接口xml中写

  1. <cache/>

序列化实体类

  1. public class User implements Serializable
  • 只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据
  • 查出的数据都会被默认先放在一级缓存中
  • 只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中