MyBatis-Plus 的一级缓存和二级缓存机制继承自 MyBatis,但进行了增强和简化。以下是详细对比和具体使用场景:
1️⃣ 一级缓存(Local Cache)
特性
作用范围:SqlSession 级别(同一个数据库会话)
默认状态:默认开启,无需配置
失效条件:
执行了 INSERT/DELETE/UPDATE 操作
调用 sqlSession.clearCache()
会话关闭(sqlSession.close())
存储内容:查询结果对象(非原始SQL)
MyBatis-Plus 中的表现
JAVA
// 示例:同一会话中重复查询
LambdaQueryWrapper wrapper = new LambdaQueryWrapper().eq(User::getId, 1);
User user1 = userMapper.selectOne(wrapper); // 查数据库
User user2 = userMapper.selectOne(wrapper); // 从一级缓存获取
System.out.println(user1 == user2); // true(同一对象引用)
⚠️ 注意:
在 Spring 集成环境中,SqlSession 通常与事务绑定,事务结束即缓存失效
分布式环境下无效(仅单机会话有效)
2️⃣ 二级缓存(Global Cache)
特性
作用范围:Mapper 级别(跨 SqlSession 共享)
默认状态:默认关闭,需手动开启
存储介质:
默认:JVM 内存(可集成 Redis/Ehcache 等)
MyBatis-Plus 支持通过 cache.enabled=true 配置
失效条件:
执行了 INSERT/DELETE/UPDATE 操作(同一 Mapper 命名空间)
手动调用 cache.clear()
MyBatis-Plus 启用步骤
实体类加注解:
JAVA
@TableName(value = "user", cache = true) // 启用二级缓存
public class User { ... }
配置文件中开启:
YAML
mybatis-plus:
configuration:
cache-enabled: true # 全局启用二级缓存
XML 映射文件声明(可选):
XML
缓存策略配置
YAML
mybatis-plus:
global-config:
db-config:
cache:
type: redis # 使用Redis作为二级缓存(需集成redisson等)
flush-interval: 60000 # 缓存刷新间隔(毫秒)