Mybatis二级缓存(使用Redis作为二级缓存)
- 手机
- 2025-08-18 08:36:01

上一篇我们介绍了mybatis中二级缓存的使用,本篇我们在此基础上介绍Mybatis中如何使用Redis作为二级缓存。
如果您对mybatis中二级缓存的使用不太了解,建议您先进行了解后再阅读本篇,可以参考:
Mybatis 二级缓存 blog.csdn.net/m1729339749/article/details/133376283
一、添加依赖 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-redis</artifactId> <version>1.0.0-beta2</version> </dependency> 二、Redis配置在resources目录下新建redis.properties配置文件
host=localhost port=6379 connectionTimeout=2000 soTimeout=2000 password=horse database=0 clientName=Mybatis_Cachehost:redis服务主机
port:redis服务端口
password:redis密码
三、创建实体类在cn.horse.demo下创建UserInfo、UserInfoQuery类,另外需要特别注意缓存的对象类型必须实现Serializable接口
UserInfo类:
package cn.horse.demo; import java.io.Serializable; public class UserInfo implements Serializable { private static final long serialVersionUID = 9213975268411777481L; private Integer id; private String name; private Integer age; public void setId(Integer id) { this.id = id; } public Integer getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(Integer age) { this.age = age; } public Integer getAge() { return age; } @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append('{'); stringBuilder.append("id: " + this.id); stringBuilder.append(", "); stringBuilder.append("name: " + this.name); stringBuilder.append(", "); stringBuilder.append("age: " + this.age); stringBuilder.append('}'); return stringBuilder.toString(); } }UserInfoQuery类:
package cn.horse.demo; public class UserInfoQuery { private Integer startAge; private Integer endAge; public void setStartAge(Integer startAge) { this.startAge = startAge; } public Integer getStartAge() { return startAge; } public void setEndAge(Integer endAge) { this.endAge = endAge; } public Integer getEndAge() { return endAge; } } 四、创建映射器、Mapper配置在cn.horse.demo下创建UserInfoMapper接口
UserInfoMapper接口:
package cn.horse.demo; import org.apache.ibatis.annotations.*; import java.util.List; public interface UserInfoMapper { List<UserInfo> find(@Param("query") UserInfoQuery query); }在resources下创建cn/horse/demo目录,并在此目录下创建UserInfoMapper.xml配置文件
UserInfoMapper.xml配置:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" " mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.horse.demo.UserInfoMapper"> <cache type="org.mybatis.caches.redis.RedisCache" /> <resultMap id="userInfoMap" type="cn.horse.demo.UserInfo"> <result column="ID" property="id" /> <result column="USERNAME" property="name"/> <result column="AGE" property="age"/> </resultMap> <select id="find" parameterType="cn.horse.demo.UserInfoQuery" resultMap="userInfoMap"> SELECT ID, USERNAME, AGE FROM T_USER <where> <if test="null != query.startAge"> AND AGE >= #{query.startAge} </if> <if test="null != query.endAge"> AND AGE <= #{query.endAge} </if> </where> </select> </mapper>注意:cache标签代表在此命名空间下使用二级缓存,type代表的是二级缓存的实现方式(这里使用的是org.mybatis.caches.redis.RedisCache)
五、引入配置文件在resources下新建mybatis-config.xml配置文件,并引入UserInfoMapper映射器。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="logImpl" value="JDK_LOGGING"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="org.gjt.mm.mysql.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8&allowMultiQueries=true"/> <property name="username" value="root"/> <property name="password" value="horse"/> </dataSource> </environment> </environments> <mappers> <mapper class="cn.horse.demo.UserInfoMapper" /> </mappers> </configuration>这里我们使用mapper引入映射器,只需要设置class属性为UserInfoMapper接口的全限类名。
六、启动程序 1、数据准备这里我们直接使用脚本初始化数据库中的数据
-- 如果数据库不存在则创建数据库 CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8; -- 切换数据库 USE demo; -- 创建用户表 CREATE TABLE IF NOT EXISTS T_USER( ID INT PRIMARY KEY, USERNAME VARCHAR(32) NOT NULL, AGE INT NOT NULL ); -- 插入用户数据 INSERT INTO T_USER(ID, USERNAME, AGE) VALUES(1, '张三', 20),(2, '李四', 22),(3, '王五', 24);创建了一个名称为demo的数据库;并在库里创建了名称为T_USER的用户表并向表中插入了数据
2、会话工具类在cn.horse.demo包下新建SqlSessionUtils工具类
package cn.horse.demo; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; import java.util.Objects; public class SqlSessionUtils { private static final SqlSessionFactory sqlSessionFactory; static { // 读取mybatis配置文件 InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml"); // 根据配置创建SqlSession工厂 sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); } /** * 开启会话 * @return */ public static SqlSession openSession() { return sqlSessionFactory.openSession(); } /** * 关闭会话 * @param sqlSession */ public static void closeSession(SqlSession sqlSession) { if(Objects.nonNull(sqlSession)) { sqlSession.close(); } } } 3、JDK 日志系统配置在resources的目录下新建logging.properties配置文件
handlers=java.util.logging.ConsoleHandler .level=INFO cn.horse.demo.level=FINER java.util.logging.ConsoleHandler.level=ALL java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tT.%1$tL %4$s %3$s - %5$s%6$s%n在cn.horse.demo下创建JdkLogConfig类
JdkLogConfig类:
package cn.horse.demo; import java.io.IOException; import java.io.InputStream; import java.util.logging.LogManager; public class JdkLogConfig { public JdkLogConfig() { try { InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("logging.properties"); LogManager.getLogManager().readConfiguration(inputStream); } catch (IOException e) { throw new RuntimeException(e); } } } 4、启动程序 package cn.horse.demo; import org.apache.ibatis.session.SqlSession; import java.util.List; import java.util.function.Consumer; import java.util.logging.Logger; public class Main { private static final Logger LOGGER; static { // 引入JDK日志配置 System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig"); LOGGER = Logger.getLogger("cn.horse.demo.Main"); } public static void main(String[] args) throws InterruptedException { // 查询 selectGreaterThan(20); // 查询 selectGreaterThan(20); } private static void selectGreaterThan(Integer age) { LOGGER.finer("--------------- 查询 ----------------"); execute((UserInfoMapper userInfoMapper) -> { UserInfoQuery query = new UserInfoQuery(); query.setStartAge(age); List<UserInfo> userInfoList = userInfoMapper.find(query); for (UserInfo userInfo: userInfoList) { LOGGER.info(userInfo.toString()); } }); } private static void execute(Consumer<UserInfoMapper> function) { SqlSession sqlSession = null; try { sqlSession = SqlSessionUtils.openSession(); function.accept(sqlSession.getMapper(UserInfoMapper.class)); sqlSession mit(); } finally { SqlSessionUtils.closeSession(sqlSession); } } }execute方法用于执行操作,方法中使用sqlSession.getMapper方法获取映射器对象,然后将映射器对象具体的执行操作委托给了Consumer对象。
执行后的结果如下:
Mybatis二级缓存(使用Redis作为二级缓存)由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Mybatis二级缓存(使用Redis作为二级缓存)”
上一篇
小谈设计模式(8)—代理模式