HELLO WORLD--一起加油(🍺)!|

kingwzun

园龄:3年6个月粉丝:111关注:0

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 这些是文件目录,自行替换。
image

样式:

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 中国大陆许可协议进行许可。

posted @   kingwzun  阅读(332)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起