Mybatsi默认缓存对象 PerpetualCache,是本地缓存 。
将缓存数据存入redis操作过程:
package com.vince.MyBatisCache;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.context.ContextLoader;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MyMyBatisCache implements Cache {
private String id; // 当前mapper的 namespace
private final ReadWriteLock lock = new ReentrantReadWriteLock();
RedisTemplate template;
public MyMyBatisCache(){} //无参构造
public MyMyBatisCache(String id){ // mybatis 创建缓存组件实例时传入
System.out.println("缓存id:"+id);
this.id=id;
}
@Override
public String getId() {
return this.id;
}
// 缓存数据
@Override
public void putObject(Object key, Object value) {
template.opsForValue().set(key.toString(), value);// 将查询结果存入 redis 缓存后备用
}
// 检查缓存
@Override
public Object getObject(Object key) {
// 获取redis组件
template =(RedisTemplate) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
System.out.println("检查缓存 key:"+key.getClass());
Object cache = template.opsForValue().get(key.toString()); // 通过sql语句检查是否有缓存可用
if (cache!=null){
System.out.println("命中缓存~");
return cache;
}else{
System.out.println("检查缓存 但是没有缓存数据~");
return null;
}
}
//删除某一个缓存数据
@Override
public Object removeObject(Object key) {
template = (RedisTemplate) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
template.delete(key.toString() );
return null;
}
// 当一个mapper中触发了一个写操作之后 清空所有缓存数据
@Override
public void clear() {
System.out.println("nameSpace:"+this.getId()+"发生了写操作,清空了所有缓存数据~");
template = (RedisTemplate) ContextLoader.getCurrentWebApplicationContext().getBean("redisTemplate");
// 获取当前mapper下的所有缓存 key
Set keys = template.keys("*" + this.getId() + "*");
// 删除 keys
template.delete(keys);
}
@Override
public int getSize() {
return 0;
}
@Override
public ReadWriteLock getReadWriteLock() {
return this.lock;
}
}
// 使用自定义缓存组件
Redis 配置文件:
在Spring 工厂中导入 redis 配置文件: