Mybatis注解開發之@CacheNamespace:實現注解二級緩存的使用


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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM