主页 > 手机  > 

Mybatis二级缓存(使用Redis作为二级缓存)

Mybatis二级缓存(使用Redis作为二级缓存)

上一篇我们介绍了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_Cache

host: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 &gt;= #{query.startAge} </if> <if test="null != query.endAge"> AND AGE &lt;= #{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&amp;useSSL=false&amp;characterEncoding=utf8&amp;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作为二级缓存)