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

代码:


posted @ 2022-10-01 19:18  kingwzun  阅读(314)  评论(0编辑  收藏  举报