mybatis 支持通过实现 org.apache.ibatis.cache.cache 接口接入 redis 等第三方缓存,需实现 getid、putobject、getobject、removeobject、clear 五个方法,并在 mapper 中通过 xml 的 标签或 @cachenamespace 注解启用,注意线程安全、key 序列化与事务一致性。

MyBatis 支持通过自定义 Cache 接口实现类,将第三方缓存(如 Redis、Caffeine、Ehcache)接入一级/二级缓存体系。核心是实现 org.apache.ibatis.cache.Cache 接口,并在 Mapper XML 或注解中声明使用该缓存。
实现 MyBatis Cache 接口
你需要新建一个类,实现 Cache 接口的 5 个抽象方法:
-
getId():返回唯一标识,通常为缓存命名空间(如
com.example.UserMapper) - putObject(Object key, Object value):写入缓存,注意 key 需序列化或转为字符串(尤其对接 Redis 时)
- getObject(Object key):读取缓存,需反序列化(若存的是字节数组)
- removeObject(Object key):删除单条缓存
- clear():清空当前 namespace 下所有缓存(例如执行 flush 或 del 匹配前缀的 key)
示例(基于 Redis 的简单实现):
public class RedisCache implements Cache {
private final String id;
private final RedisTemplate<string object> redisTemplate;
<p>public RedisCache(String id) {
this.id = id;
this.redisTemplate = SpringContextUtil.getBean(RedisTemplate.class);
}</p>
<p>@Override
public String getId() {
return id;
}</p>
<p>@Override
public void putObject(Object key, Object value) {
String cacheKey = buildKey(key);
redisTemplate.opsForValue().set(cacheKey, value, 10, TimeUnit.MINUTES);
}</p>
<p>@Override
public Object getObject(Object key) {
return redisTemplate.opsForValue().get(buildKey(key));
}</p>
<p>@Override
public Object removeObject(Object key) {
String cacheKey = buildKey(key);
Object value = getObject(key);
redisTemplate.delete(cacheKey);
return value;
}</p>
<p>@Override
public void clear() {
// 按命名空间前缀清理,如 "com.example.UserMapper:<em>"
Set<string> keys = redisTemplate.keys(id + ":</string></em>");
if (keys != null && !keys.isEmpty()) {
redisTemplate.delete(keys);
}
}</p>
<p>private String buildKey(Object key) {
return id + ":" + key.toString();
}
}</p></string>
在 Mapper 中启用自定义缓存
有两种方式启用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
XML 方式:在
<mapper></mapper>标签下添加<cache type="com.example.RedisCache"></cache> -
注解方式:在 Mapper 接口上加
@CacheNamespace(implementation = RedisCache.class)
⚠️ 注意:@CacheNamespace 必须加在接口上,且 MyBatis 3.4.0+ 才支持直接指定 implementation;旧版本需配合 @CacheNamespaceRef 或全局配置别名。
注册缓存类为 MyBatis 可识别类型(可选)
如果不想每次写全限定类名,可在 MyBatis 配置中注册别名:
<configuration><typealiases><typealias alias="redisCache" type="com.example.RedisCache"></typealias></typealiases></configuration>
之后 XML 中即可写:<cache type="redisCache"></cache>
注意事项与建议
- 缓存 key 必须全局唯一且可比较:MyBatis 默认用
CacheKey对象(含 statementId + offset + limit + params 等),你存入第三方缓存时建议序列化为字符串(如用 MD5 或 Base64 编码) - 避免缓存击穿/雪崩:Redis 实现中建议加随机过期时间、空值缓存(null object pattern)
- 事务一致性:二级缓存默认在 SqlSession 提交后才写入,但第三方缓存无法感知 MyBatis 事务生命周期,建议搭配
@SelectKey或手动清除相关缓存 - 线程安全:MyBatis 保证
Cache实例被单个 namespace 共享,你的实现必须线程安全(RedisTemplate 本身是线程安全的)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










