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
代码:
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/16747626.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步