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>

Mybatis注解开发之@CacheNamespace:实现注解二级缓存的使用的更多相关文章

  1. Spring注解开发-全面解析常用注解使用方法之生命周期

    本文github位置:https://github.com/WillVi/Spring-Annotation/ 往期文章:Spring注解开发-全面解析常用注解使用方法之组件注册 bean生命周期 ​ ...

  2. mybatis由浅入深day02_7.4mybatis整合ehcache_7.5二级缓存应用场景_7.6二级缓存局限性

    7.4 mybatis整合ehcache EhCache 是一个纯Java的进程内缓存框架,是一种广泛使用的开源Java分布式缓存,具有快速.精干等特点,是Hibernate中默认的CacheProv ...

  3. MyBatis从入门到放弃七:二级缓存原理分析

    前言 说起mybatis的一级缓存和二级缓存我特意问了几个身边的朋友他们平时会不会用,结果没有一个人平时业务场景中用. 好吧,那我暂且用来学习源码吧.一级缓存我个人认为也确实有些鸡肋,mybatis默 ...

  4. Spring注解开发-全面解析常用注解使用方法之组件注册

    目录 1. @Configuration 2. @ComponentScan excludeFilters includeFilters 使用自定义TypeFilter 3. @Bean @Scope ...

  5. 注解开发中的@Results注解使用

    package com.hope.dao;import com.hope.domain.User;import com.sun.xml.internal.bind.v2.model.core.ID;i ...

  6. 【MyBatis】MyBatis 注解开发

    MyBatis 注解开发 文章源码 环境搭建 Mybatis 也可以使用注解开发方式,这样就可以减少编写 Mapper 映射文件. 常用注解说明: @Insert 实现新增 @Update 实现更新 ...

  7. Mybatis学习笔记-注解开发

    面向接口编程 根本原因:[解耦],[可拓展],[更高规范性] 接口类型: abstract class interface 使用注解开发 简单语句可用注解开发(直接查询,列名与属性名相同) 本质:反射 ...

  8. Spring _day02_IoC注解开发入门

    1.Spring IoC注解开发入门 1.1 注解开发案例: 创建项目所需要的jar,四个基本的包(beans core context expression ),以及两个日志记录的包,还要AOP的包 ...

  9. Spring_IoC注解开发和AOP的XML开发(学习笔记2)

    一:IoC注解开发 1,在applicationContext.xml中需要引入context约束 <beans xmlns="http://www.springframework.o ...

随机推荐

  1. CCF-交通规划-dijkstra+贪心

    交通规划 问题描述 G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统. 建设高速铁路投入非常大,为了节约建设成本,G国国王决定不新建铁路,而是将已有的铁路改造成 ...

  2. dedecms织梦的安全问题解决办法

    很多新手用户在使用织梦CMS程序过程中,难免会碰到挂马中毒现象,所以事先我们要对网站及服务器安全做好预防备份处理. 织梦作为国内第一大开源免费CMS程序,无疑是很多HACK研究的对象,在本身不安全的互 ...

  3. Git实现1个项目2个地址1次推送

    Git实现1个项目2个地址1次推送 考虑到不需要pull操作,因此本方法适用于个人项目分别在两个平台或地址进行部署 给origin 增加一个可以push的地址 git remote set-url - ...

  4. PIE模型

    首先,我们需要明确程序的Bug有如下的定义: 1. Fault/Defect 静态的,存在于软件中的缺陷.例如:一段有缺失或者错误的代码. 2. Error 运行时一种不正确的中间状态. 3. Fai ...

  5. 说说 JavaScript中 call和apply

    下面有关JavaScript中 call和apply的描述,错误的是? call与apply都属于Function.prototype的一个方法,所以每个function实例都有call.apply属 ...

  6. P3980 [NOI2008]志愿者招募 (费用流)

    题意:最多1000天 每天需要至少ai个工人施工 有10000种工人可以雇佣 每种工人可以工作si到ti天 雇佣一个的花费是ci 问怎样安排使得施工花费最少 思考:最直白的建模方式 就是每种工人可以和 ...

  7. HDU6532 Chessboard (最大费用流)

    题意:棋盘上有n个棋子 每个棋子都有收益 现在给定1e5条线 有横着的 竖着的 规定只能在线的一侧选最多ki个棋子 问最大收益 题解:写自闭的一道题 很容易想到是网络流 但是建图有点难 第一道最大费用 ...

  8. &#128218;C#/.NET/.NET Core推荐学习书籍(升职加薪,你值得拥有)

    前言: 作为一名程序员,我们无时无刻都要考虑着如何通过不断地学习来提升自己的核心竞争力.古人有云:"书中自有黄金屋,书中只有颜如玉",说明了书籍的重要性,没错工作多年来,发现身边那 ...

  9. CF1466-D. 13th Labour of Heracles

    CF1466-D. 13th Labour of Heracles 题意: 给出一个由\(n\)个点构成的树,每个点都有一个权值.现在你可以用\(k,k\subset\)\([1, n]\)个颜色来给 ...

  10. windows7 更新失败,无法开机处理方法

    记录一次今天同事笔记本无法开机的故障处理 windows7系统,安装更新失败,无法开机,卡在配置更新界面 处理方法,强制关机,开机按F8,进入安全模式,安全模式还会卡在配置更新界面,但是卡一会会进入系 ...