核心概览
- 一级缓存:默认开启,作用范围在 同一个 SqlSession 内。
- 二级缓存:需要手动配置开启,作用范围在 同一个 Mapper 命名空间(即同一个 Mapper 接口)内,可以被多个 SqlSession 共享。
一级缓存
1. 作用域
- SqlSession 级别:当同一个 SqlSession 执行相同的 SQL 查询时,MyBatis 会优先从缓存中获取数据,而不是直接查询数据库。
- 它是 默认开启 的,无法关闭,但可以配置其作用范围(
SESSION 或 STATEMENT)。
2. 工作机制
- 第一次执行查询后,查询结果会被存储到 SqlSession 关联的一级缓存中。
- 在同一个 SqlSession 中,再次执行 完全相同的 SQL 查询(包括语句和参数)时,会直接返回缓存中的对象,而不会去数据库查询。
- 如果 SqlSession 执行了 增(INSERT)、删(DELETE)、改(UPDATE) 操作,或者调用了
commit()、close()、rollback() 方法,该 SqlSession 的一级缓存会被清空。这是为了防止读取到脏数据。
3. 示例说明
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user1 = mapper.selectUserById(1L);
System.out.println(user1);
User user2 = mapper.selectUserById(1L);
System.out.println(user2);
System.out.println(user1 == user2);
mapper.updateUser(user1);
User mapper.selectUserById();
System.out.println(user3 == user1);
}