MyBatis一级缓存默认启用、无需配置,作用于同一SqlSession内相同查询(SQL、参数、环境完全一致),执行增删改、提交/回滚事务、关闭SqlSession或调用clearCache()均会清空缓存。

MyBatis 一级缓存不需要“开启”,它默认就生效,也不支持全局关闭。
一级缓存的默认行为
只要使用 MyBatis,一级缓存就自动启用。它绑定在 SqlSession 实例上,属于本地内存缓存,底层用 HashMap 存储,键是 CacheKey(由 SQL 语句、参数、映射器 ID、分页参数等共同构成),值是查询结果。
作用范围:仅限同一个 SqlSession
只有在同一个 SqlSession 对象内,连续执行完全相同的 select 查询(SQL 字符串、参数值、环境配置均一致),第二次起才会命中缓存,跳过数据库访问。
- 不同 SqlSession 即使执行相同 SQL,也互不影响,各自维护独立缓存
- Spring Boot 中,无 @Transactional 时,每个 Mapper 方法调用通常对应一个新 SqlSession;加了 @Transactional 后,整个事务共用一个 SqlSession,缓存可跨多个 Mapper 调用共享
什么情况下一级缓存会失效
为保证数据一致性,以下任一操作都会清空当前 SqlSession 的全部一级缓存:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 执行任意 insert / update / delete 语句(哪怕不是当前 mapper 的,只要是同一 namespace 或其他 namespace,只要走这个 SqlSession 就清)
- 调用 sqlSession.commit() 或 sqlSession.rollback()
- 调用 sqlSession.close() 或 sqlSession.clearCache()
- select 标签中显式设置 flushCache="true"
- 使用 ResultHandler 或 Cursor 进行流式查询
不建议修改但可了解的配置项
极少数场景下,如需让一级缓存只对单条语句有效(即每次查询都视为新会话),可通过配置调整作用域:
该设置会让一级缓存退化为“语句级”,相当于关闭跨语句缓存能力;默认值是 SESSION,也就是常规的 SqlSession 级别。

















