開發環境
- JDK 1.8
- SpringBoot2.2.1
- MybatisPlus3.4.3.4
- Maven 3.2+
- Mysql5.7.36
- 開發工具
- IntelliJ IDEA
- smartGit
使用阿里的腳手架,鏈接:https://start.aliyun.com

選擇mybatis plus framework

然后專案基礎架構搭建好之后,加上redis配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
加上redis配置:
spring:
redis:
host: 127.0.0.1
port: 6379
password:
database: 0
MyBatisPlus開啟快取支持

實作Cache介面,因為這個類不是Spring管理的,所以通過SpringContextHolder從ioc容器里獲取redisTemplate類
package com.example.mybatisplus.common.cache;
import com.example.mybatisplus.common.ioc.SpringContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@Slf4j
public class MyBatisRedisCache implements Cache {
private static RedisTemplate<String , Object> redisTemplate;
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
private String id;
public MyBatisRedisCache(String id) {
if (StringUtils.isEmpty(id)) {
throw new IllegalArgumentException("cache instances require an id.");
}
this.id = id;
if (redisTemplate == null) {
redisTemplate = SpringContextHolder.getBean("redisTemplate");
}
}
@Override
public String getId() {
return this.id;
}
@Override
public void putObject(Object key, Object value) {
if (!StringUtils.isEmpty(value)) {
redisTemplate.opsForHash().put(id, key.toString() , value);
log.info("mybatis快取,{}:[{}]" , key , value );
}
}
@Override
public Object getObject(Object key) {
if (!StringUtils.isEmpty(key)) {
Object object = redisTemplate.opsForHash().get(id , key.toString());
log.info("mybatis快取讀取,{}:[{}]", key , object);
return object;
}
return null;
}
@Override
public Object removeObject(Object key) {
if (!StringUtils.isEmpty(key)) {
redisTemplate.delete(key.toString());
}
return null;
}
@Override
public void clear() {
redisTemplate.delete(id.toString());
}
@Override
public int getSize() {
return redisTemplate.opsForHash().size(id.toString()).intValue();
}
@Override
public ReadWriteLock getReadWriteLock() {
return readWriteLock;
}
}
修改CacheNamespace指定快取類,implementation 屬性:默認是PerpetualCache類,即hashMap實作
package com.example.mybatisplus.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus.common.cache.MyBatisRedisCache;
import com.example.mybatisplus.model.User;
import org.apache.ibatis.annotations.CacheNamespace;
@DS(value = "shop")
@CacheNamespace(implementation = MyBatisRedisCache.class ,eviction = MyBatisRedisCache.class)
public interface UserMapper extends BaseMapper<User>{
}
SpringContextHolder 類
package com.example.mybatisplus.common.ioc;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
@Service
@Lazy(false)
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHolder.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
assertContextInjected();
return applicationContext;
}
public static <T> T getBean(String name) {
assertContextInjected();
return (T) applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> requiredType) {
assertContextInjected();
return applicationContext.getBean(requiredType);
}
public static void clearHolder() {
applicationContext = null;
}
@Override
public void destroy() throws Exception {
SpringContextHolder.clearHolder();
}
private static void assertContextInjected() {
Assert.state(applicationContext != null,"applicaitonContext屬性未注入");
}
}
測驗,快取里沒資料,讀取資料庫

快取有資料,不讀取資料庫

本博客代碼例子可以在GitHub找到下載鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/403950.html
標籤:其他
上一篇:【Android 教程系列第 28 篇】Android 分別使用 jarsigner 和 apksigner 對 APK 簽名(v1、v2 簽名)的詳細教程
