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>
Mybatis注解开发之@CacheNamespace:实现注解二级缓存的使用的更多相关文章
- Spring注解开发-全面解析常用注解使用方法之生命周期
本文github位置:https://github.com/WillVi/Spring-Annotation/ 往期文章:Spring注解开发-全面解析常用注解使用方法之组件注册 bean生命周期 ...
- mybatis由浅入深day02_7.4mybatis整合ehcache_7.5二级缓存应用场景_7.6二级缓存局限性
7.4 mybatis整合ehcache EhCache 是一个纯Java的进程内缓存框架,是一种广泛使用的开源Java分布式缓存,具有快速.精干等特点,是Hibernate中默认的CacheProv ...
- MyBatis从入门到放弃七:二级缓存原理分析
前言 说起mybatis的一级缓存和二级缓存我特意问了几个身边的朋友他们平时会不会用,结果没有一个人平时业务场景中用. 好吧,那我暂且用来学习源码吧.一级缓存我个人认为也确实有些鸡肋,mybatis默 ...
- Spring注解开发-全面解析常用注解使用方法之组件注册
目录 1. @Configuration 2. @ComponentScan excludeFilters includeFilters 使用自定义TypeFilter 3. @Bean @Scope ...
- 注解开发中的@Results注解使用
package com.hope.dao;import com.hope.domain.User;import com.sun.xml.internal.bind.v2.model.core.ID;i ...
- 【MyBatis】MyBatis 注解开发
MyBatis 注解开发 文章源码 环境搭建 Mybatis 也可以使用注解开发方式,这样就可以减少编写 Mapper 映射文件. 常用注解说明: @Insert 实现新增 @Update 实现更新 ...
- Mybatis学习笔记-注解开发
面向接口编程 根本原因:[解耦],[可拓展],[更高规范性] 接口类型: abstract class interface 使用注解开发 简单语句可用注解开发(直接查询,列名与属性名相同) 本质:反射 ...
- Spring _day02_IoC注解开发入门
1.Spring IoC注解开发入门 1.1 注解开发案例: 创建项目所需要的jar,四个基本的包(beans core context expression ),以及两个日志记录的包,还要AOP的包 ...
- Spring_IoC注解开发和AOP的XML开发(学习笔记2)
一:IoC注解开发 1,在applicationContext.xml中需要引入context约束 <beans xmlns="http://www.springframework.o ...
随机推荐
- C++的智能指针你了解吗?
- SPF POJ - 1523 割点+并查集
题意: 问你这个图中哪个点是割点,如果把这个点去掉会有几个子网 代码: 1 //给你几个点,用着几个点形成了一个图.输入边形成的图,问你这个图中有多少个割点.每一个割点去掉后会形成几个强连通分量 2 ...
- 爬虫入门三 scrapy
title: 爬虫入门三 scrapy date: 2020-03-14 14:49:00 categories: python tags: crawler scrapy框架入门 1 scrapy简介 ...
- IFIX 目录结构
iFIX使用了许多目录存储程序和数据文件.用路径配置对话框来指定iFIX目录的位置和名称.可在SCU工具箱中单击"路径"按钮显示该对话框. 当iFIX安装后它将创建一个目录,该目录 ...
- springboot( 三)redis demo
redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Red ...
- mybatis(八)手写简易版mybatis
一.画出流程图 二.设计核心类 二.V1.0 的实现 创建一个全新的 maven 工程,命名为 mebatis,引入 mysql 的依赖. <dependency> <groupId ...
- React Gatsby 最新教程
React Gatsby 最新教程 https://www.gatsbyjs.com/docs/quick-start/ https://www.gatsbyjs.com/docs/tutorial/ ...
- 设计模式六大原则 All In one
设计模式六大原则 All In one 开闭原则: 对扩展开放,对修改关闭; 设计模式的六大原则: 0.总原则-开闭原则 对扩展开放, 对修改封闭; 在程序需要进行拓展的时候, 不能去修改原有的代码, ...
- Open Source Web Monitor System
Open Source Web Monitor System 开源 Web 监控系统 Front End Monitor System / Front End Monitor Platform 前端监 ...
- Roman Numerals All In One
Roman Numerals All In One 罗马数字 refs https://www.mathsisfun.com/roman-numerals.html https://www.maths ...