MyBatis 的一级缓存是什么?

Mybatis 的一级缓存是SqlSession级别的缓存,仅在一次会话中有效。

与二级缓存相比,一级缓存有以下特点:

  • 与数据库连接的事务相关
  • 自动管理,无需手动配置
  • 只在一次会话中有效,SqlSession关闭后失效。

使用时:

  • 多个Mapper操作会共享一级缓存.
  • 对同一查询条件的查询,只会执行一次真实的数据库查询。
  • 后续的相同查询,将会从缓存中获取。

一级缓存默认开启,具体表现为:

SqlSession session = factory.openSession();
try {    
   User user1 = session.selectOne("com.itzhimei.mapper.UserMapper.findUser", 1);
   User user2 = session.selectOne("com.itzhimei.mapper.UserMapper.findUser", 1);  
   System.out.println(user1 == user2); // true
} finally {
   session.close();
}

这里,user1 == user2 永远为true。

这是因为user2其实来自一级缓存,并没有二次查询数据库。

一级缓存的弊端:

  • 只在一次会话中有效,SqlSession关闭后失效。
  • 不同的SqlSession无法共享数据。