Springboot整合Redis作为Mybatis的二级缓存
参考原文:https://juejin.cn/post/6971740313501368356
一级缓存是:sqlSession,sql建立连接到关闭连接的数据缓存
二级缓存是:全局的缓存
准备
配置文件启用打印sql语句
配置文件启用打印sql语句
方法1
#Mybatis打印sql语句
logging.level.com.sdut.test2.mapper=debug
注意:.com.sdut.test2.mapper 这些是文件目录,自行替换。
样式:
2022-10-01 20:54:09.463 DEBUG 15952 --- [nio-8080-exec-3] c.s.t.d.m.UserMapper.findUserById_COUNT : ==> Preparing: SELECT count(0) FROM user WHERE id = ?
2022-10-01 20:54:09.463 DEBUG 15952 --- [nio-8080-exec-3] c.s.t.d.m.UserMapper.findUserById_COUNT : ==> Parameters: 52(Integer)
2022-10-01 20:54:09.465 DEBUG 15952 --- [nio-8080-exec-3] c.s.t.d.m.UserMapper.findUserById_COUNT : <== Total: 1
2022-10-01 20:54:09.465 DEBUG 15952 --- [nio-8080-exec-3] c.s.t.d.mapper.UserMapper.findUserById : ==> Preparing: select *from user where id=? limit ?,?
2022-10-01 20:54:09.466 DEBUG 15952 --- [nio-8080-exec-3] c.s.t.d.mapper.UserMapper.findUserById : ==> Parameters: 52(Integer), 0(Integer), 5(Integer)
2022-10-01 20:54:09.468 DEBUG 15952 --- [nio-8080-exec-3] c.s.t.d.mapper.UserMapper.findUserById : <== Total: 1
方法2
#开启mybaits的打印sql语句
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
样式:
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@513c7154] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@1610323203 wrapping com.mysql.cj.jdbc.ConnectionImpl@60861446] will not be managed by Spring
==> Preparing: SELECT count(0) FROM user WHERE id = ?
==> Parameters: 69(Integer)
<== Columns: count(0)
<== Row: 1
<== Total: 1
==> Preparing: select *from user where id=? limit ?,?
==> Parameters: 69(Integer), 0(Integer), 5(Integer)
<== Columns: id, username, birthday, sex, address
<== Row: 69, 你好, 2022-09-23 17:40:10, 女, 山东理工大学
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@513c7154]
配置启动类
添加注解:
@EnableCaching // 开启Spring Boot基于注解的缓存管理支持
实体类实现序列化接口
public class User implements Serializable {// 必须实现序列化接口!
//....
}
实现
编写RedisConfig类
可以直接复制
使用注解实现缓存,可以重写RedisCacheManager方法,进行自定义序列化方式。
使用:
如果想要使用自定义序列化方式的RedisCacheManager进行数据缓存操作,可以创建一个名为cacheManager的Bean组件,并在该组件中设置对应的序列化方式即可。
代码:
@Configuration // 定义一个配置类
public class RedisConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
// 分别创建String和JSON格式序列化对象,对缓存数据key和value进行转换
RedisSerializer<String> strSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jacksonSeial =
new Jackson2JsonRedisSerializer(Object.class);
// 解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
// 定制缓存数据序列化方式及时效
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(strSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();
return cacheManager;
}
}
基于注解实现
就是在service层的方法上写上注解。
(如果没有service层,在mapper接口的方法上面注解一样)
注解含义参考:
https://www.cnblogs.com/kingwz/p/16733210.html#spring-boot-缓存注解介绍
问题1:插入的返回值没有id属性
因为要放入缓存,因此生成缓存时,传入的参数和返回值两者中,必须要有一个具有完整的实体类。
但是我插入时没有插入主键,是让主键自增的,因此要解决获取主键的问题。
解决方法:
https://www.cnblogs.com/kingwz/p/16747865.html
代码: