MyBatis二級緩存使用:
官方建議在service使用緩存,但是你也可以直接在mapper層緩存,這里的二級緩存就是直接在Mapper層進行緩存操作
Mybatis的二級緩存實現也十分簡單,只要在springboot的配置文件打開二級緩存,即:mybatis-plus.configuration.cache-enabled=true
在Dao接口上增加注解
@CacheNamespace(implementation= MybatisPlusCache.class,eviction=MybatisPlusCache.class) public interface DictEntryDao extends BaseMapper<DictEntry> { }
與controller同級新建configuration文件夾,在文件夾下添加MybatisPlusCache類,代碼如下:
package com.ljxx.app.configuration; import com.ljxx.app.utils.ApplicationContextUtil; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.cache.Cache; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @author zhongyushi * @date 2020/9/28 0028 * @dec MybatisPlus緩存配置,使用redis作為緩存服務器 */ @Slf4j public class MybatisPlusCache implements Cache { // 讀寫鎖 private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true); //這里使用了redis緩存,使用springboot自動注入 private RedisTemplate<String, Object> redisTemplate; private String id; //是mybatis必須要求的,必寫。此id是xml中的namespace的值 public MybatisPlusCache(final String id) { if (id == null) { throw new IllegalArgumentException("未獲取到緩存實例id"); } this.id = id; } //返回cache的唯一名稱 @Override public String getId() { return this.id; } //緩存存值 @Override public void putObject(Object key, Object value) { //id是namespace的值,key是方法名,value是查詢的結果 getRedisTemplate().opsForHash().put(id, key.toString(), value); } //緩存取值 @Override public Object getObject(Object key) { return getRedisTemplate().opsForHash().get(id, key.toString()); } //mybatis保留方法 @Override public Object removeObject(Object key) { return null; } //清空緩存,在增刪改時會自動調用 @Override public void clear() { getRedisTemplate().delete(id); } @Override public int getSize() { return getRedisTemplate().opsForHash().size(id).intValue(); } @Override public ReadWriteLock getReadWriteLock() { return this.readWriteLock; } //獲取RedisTemplate,不能通過注入的方式,原因是此類是由mybatis實例化的 private RedisTemplate getRedisTemplate() { //從上下文中獲取redisTemplate RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtil.getBean("redisTemplate"); //設置key是string類型的序列 redisTemplate.setKeySerializer(new StringRedisSerializer()); //設置hashKey是string類型的序列 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); return redisTemplate; } }
如果是BaseMapper自帶的方法,則配置@CacheNamespace(implementation= MybatisPlusCache.class,eviction=MybatisPlusCache.class)即可,如果是自定義的方法,則要在Mapper.xml中添加如下配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ljxx.app.dao.DictEntryDao">
<cache-ref namespace="com.ljxx.app.dao.DictEntryDao"/>
</mapper>
