前言:干货记录学习mybatis实际开发中缓存的使用。
环境: springboot2.X + mybatis3.x
Mybatis是一款持久层框架,它提供了一级缓存和二级缓存。
名词解释- 一级缓存(mybatis默认开启)
同一个sqlSession中有效,在同一个SqlSession中,执行两次相同的sql查询,第二次不走数据库查询,而是在缓存中获取。 - 二级缓存(需要开发者自行添加代码开启)
二级缓存开启后,不同的sqlSession获取同一数据时,可以不走数据库查询直接从缓存中获取。
缓存原理:PerpetualCache 的 HashMap本地缓存
**注意:被缓存的对象可以被序列化和反序列化,就是实现实现Serializable接口**
使用redis替换mybatis自身的缓存实现(分布式缓存)//功能简写了,使用时根据自己实际情况修改
public class MyRedisCache implements Cache {
private final String id; // 【必须】当前放入缓存的Mapper的 namespace 名称空间
private final Map
自定义缓存执行类时注意的问题
- RedisTemplate对象是自动注入到IOC容器中,然后通过ApplicationContext对象回去容器对象。
在Spring Boot 内部 提供接口 ApplicationContextAware 获取IOC容器ApplicationContext对象。然后通过applicationContext对象获取Redis操作对象 RedisTemplate 对象。
//用来获取springboot创建好的工厂
@Configuration
public class ApplicationContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
//提供在工厂中获取对象的方法 工厂中RedisTemplate 默认 name redisTemplate
public static Object getBean(String beanName){
return applicationContext.getBean(beanName);
}
}
- 通过查看源码得到mybatis做缓存时使用的是Map,那么他的key的设计就很重要了,mybatis是使用mapper的 namespace 和sql做key,我们根据实际情况自己设计,存入redis的key的策略和合适的数据结构存储值(redis的数据结构后续更新)。我使用的是hash结构,redisTemplate.opsForHash().put(namespace,key,value);
感谢您的阅读,各位大佬有什么意见和问题欢迎评论区留言!
觉得文章对你有帮助记得给我点个赞,欢迎大家关注和转发文章!



