• Mybatis 二级缓存(使用Ehcache作为二级缓存)


    上一篇我们介绍了mybatis中二级缓存的使用,本篇我们在此基础上介绍Mybatis中如何使用Ehcache作为二级缓存。

    如果您对mybatis中二级缓存的使用不太了解,建议您先进行了解后再阅读本篇,可以参考:

    Mybatis 二级缓存icon-default.png?t=N7T8https://blog.csdn.net/m1729339749/article/details/133376283

    一、添加依赖

    1. <dependency>
    2. <groupId>org.mybatisgroupId>
    3. <artifactId>mybatisartifactId>
    4. <version>3.4.5version>
    5. dependency>
    6. <dependency>
    7. <groupId>mysqlgroupId>
    8. <artifactId>mysql-connector-javaartifactId>
    9. <version>5.1.49version>
    10. dependency>
    11. <dependency>
    12. <groupId>org.slf4jgroupId>
    13. <artifactId>slf4j-apiartifactId>
    14. <version>2.0.9version>
    15. dependency>
    16. <dependency>
    17. <groupId>org.slf4jgroupId>
    18. <artifactId>slf4j-simpleartifactId>
    19. <version>2.0.9version>
    20. dependency>
    21. <dependency>
    22. <groupId>org.mybatis.cachesgroupId>
    23. <artifactId>mybatis-ehcacheartifactId>
    24. <version>1.2.3version>
    25. dependency>

    二、Ehcache配置

    在resources目录下新建ehcache.xml配置文件

    1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    3. <diskStore path="java.io.tmpdir"/>
    4. <defaultCache
    5. maxElementsInMemory="10000"
    6. eternal="false"
    7. timeToIdleSeconds="120"
    8. timeToLiveSeconds="120"
    9. maxElementsOnDisk="10000000"
    10. diskExpiryThreadIntervalSeconds="120"
    11. memoryStoreEvictionPolicy="LRU">
    12. <persistence strategy="localTempSwap"/>
    13. defaultCache>
    14. ehcache>

    三、创建实体类

    在cn.horse.demo下创建UserInfo、UserInfoQuery类,另外需要特别注意缓存的对象类型必须实现Serializable接口

    UserInfo类:

    1. package cn.horse.demo;
    2. import java.io.Serializable;
    3. public class UserInfo implements Serializable {
    4. private static final long serialVersionUID = 9213975268411777481L;
    5. private Integer id;
    6. private String name;
    7. private Integer age;
    8. public void setId(Integer id) {
    9. this.id = id;
    10. }
    11. public Integer getId() {
    12. return id;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public String getName() {
    18. return name;
    19. }
    20. public void setAge(Integer age) {
    21. this.age = age;
    22. }
    23. public Integer getAge() {
    24. return age;
    25. }
    26. @Override
    27. public String toString() {
    28. StringBuilder stringBuilder = new StringBuilder();
    29. stringBuilder.append('{');
    30. stringBuilder.append("id: " + this.id);
    31. stringBuilder.append(", ");
    32. stringBuilder.append("name: " + this.name);
    33. stringBuilder.append(", ");
    34. stringBuilder.append("age: " + this.age);
    35. stringBuilder.append('}');
    36. return stringBuilder.toString();
    37. }
    38. }

    UserInfoQuery类:

    1. package cn.horse.demo;
    2. public class UserInfoQuery {
    3. private Integer startAge;
    4. private Integer endAge;
    5. public void setStartAge(Integer startAge) {
    6. this.startAge = startAge;
    7. }
    8. public Integer getStartAge() {
    9. return startAge;
    10. }
    11. public void setEndAge(Integer endAge) {
    12. this.endAge = endAge;
    13. }
    14. public Integer getEndAge() {
    15. return endAge;
    16. }
    17. }

    四、创建映射器、Mapper配置

    在cn.horse.demo下创建UserInfoMapper接口

    UserInfoMapper接口:

    1. package cn.horse.demo;
    2. import org.apache.ibatis.annotations.*;
    3. import java.util.List;
    4. public interface UserInfoMapper {
    5. List find(@Param("query") UserInfoQuery query);
    6. }

    在resources下创建cn/horse/demo目录,并在此目录下创建UserInfoMapper.xml配置文件

    UserInfoMapper.xml配置:

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="cn.horse.demo.UserInfoMapper">
    6. <cache type="org.mybatis.caches.ehcache.EhcacheCache" />
    7. <resultMap id="userInfoMap" type="cn.horse.demo.UserInfo">
    8. <result column="ID" property="id" />
    9. <result column="USERNAME" property="name"/>
    10. <result column="AGE" property="age"/>
    11. resultMap>
    12. <select id="find" parameterType="cn.horse.demo.UserInfoQuery" resultMap="userInfoMap">
    13. SELECT
    14. ID,
    15. USERNAME,
    16. AGE
    17. FROM T_USER
    18. <where>
    19. <if test="null != query.startAge">
    20. AND AGE >= #{query.startAge}
    21. if>
    22. <if test="null != query.endAge">
    23. AND AGE <= #{query.endAge}
    24. if>
    25. where>
    26. select>
    27. mapper>

    注意:cache标签代表在此命名空间下使用二级缓存,type代表的是二级缓存的实现方式(这里使用的是org.mybatis.caches.ehcache.EhcacheCache)

    五、引入配置文件

    在resources下新建mybatis-config.xml配置文件,并引入UserInfoMapper映射器。

    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <settings>
    7. <setting name="logImpl" value="SLF4J"/>
    8. settings>
    9. <environments default="development">
    10. <environment id="development">
    11. <transactionManager type="JDBC"/>
    12. <dataSource type="POOLED">
    13. <property name="driver" value="org.gjt.mm.mysql.Driver"/>
    14. <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8&allowMultiQueries=true"/>
    15. <property name="username" value="root"/>
    16. <property name="password" value="horse"/>
    17. dataSource>
    18. environment>
    19. environments>
    20. <mappers>
    21. <mapper class="cn.horse.demo.UserInfoMapper" />
    22. mappers>
    23. configuration>

    由于ehcache中使用的是slf4j作为日志系统,所以我们这里把slf4j也作为mybatis的日志系统。 

    这里我们使用mapper引入映射器,只需要设置class属性为UserInfoMapper接口的全限类名。

    六、启动程序

    1、数据准备

    这里我们直接使用脚本初始化数据库中的数据

    1. -- 如果数据库不存在则创建数据库
    2. CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8;
    3. -- 切换数据库
    4. USE demo;
    5. -- 创建用户表
    6. CREATE TABLE IF NOT EXISTS T_USER(
    7. ID INT PRIMARY KEY,
    8. USERNAME VARCHAR(32) NOT NULL,
    9. AGE INT NOT NULL
    10. );
    11. -- 插入用户数据
    12. INSERT INTO T_USER(ID, USERNAME, AGE)
    13. VALUES(1, '张三', 20),(2, '李四', 22),(3, '王五', 24);

    创建了一个名称为demo的数据库;并在库里创建了名称为T_USER的用户表并向表中插入了数据

    2、会话工具类

    在cn.horse.demo包下新建SqlSessionUtils工具类

    1. package cn.horse.demo;
    2. import org.apache.ibatis.session.SqlSession;
    3. import org.apache.ibatis.session.SqlSessionFactory;
    4. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    5. import java.io.InputStream;
    6. import java.util.Objects;
    7. public class SqlSessionUtils {
    8. private static final SqlSessionFactory sqlSessionFactory;
    9. static {
    10. // 读取mybatis配置文件
    11. InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
    12. // 根据配置创建SqlSession工厂
    13. sqlSessionFactory = new SqlSessionFactoryBuilder()
    14. .build(inputStream);
    15. }
    16. /**
    17. * 开启会话
    18. * @return
    19. */
    20. public static SqlSession openSession() {
    21. return sqlSessionFactory.openSession();
    22. }
    23. /**
    24. * 关闭会话
    25. * @param sqlSession
    26. */
    27. public static void closeSession(SqlSession sqlSession) {
    28. if(Objects.nonNull(sqlSession)) {
    29. sqlSession.close();
    30. }
    31. }
    32. }

    3、SLF4J日志系统配置

    在resources目录下新建simplelogger.properties配置文件

    1. org.slf4j.simpleLogger.logFile=System.err
    2. org.slf4j.simpleLogger.defaultLogLevel=info
    3. org.slf4j.simpleLogger.log.cn.horse.demo=debug
    4. org.slf4j.simpleLogger.log.net.sf.ehcache.Cache=debug
    5. org.slf4j.simpleLogger.showDateTime=true
    6. org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss.SSS
    7. org.slf4j.simpleLogger.showThreadName=true
    8. org.slf4j.simpleLogger.showLogName=true
    9. org.slf4j.simpleLogger.showShortLogName=false
    10. org.slf4j.simpleLogger.levelInBrackets=true
    11. org.slf4j.simpleLogger.warnLevelString=WARN

    4、启动程序

    1. package cn.horse.demo;
    2. import org.apache.ibatis.session.SqlSession;
    3. import org.slf4j.Logger;
    4. import org.slf4j.LoggerFactory;
    5. import java.util.ArrayList;
    6. import java.util.Arrays;
    7. import java.util.List;
    8. import java.util.function.Consumer;
    9. import java.util.logging.Level;
    10. public class Main {
    11. private static final Logger LOGGER = LoggerFactory.getLogger("cn.horse.demo.Main");
    12. public static void main(String[] args) throws InterruptedException {
    13. // 查询
    14. selectGreaterThan(20);
    15. // 查询
    16. selectGreaterThan(20);
    17. }
    18. private static void selectGreaterThan(Integer age) {
    19. LOGGER.debug("--------------- 查询 ----------------");
    20. execute((UserInfoMapper userInfoMapper) -> {
    21. UserInfoQuery query = new UserInfoQuery();
    22. query.setStartAge(age);
    23. List userInfoList = userInfoMapper.find(query);
    24. for (UserInfo userInfo: userInfoList) {
    25. LOGGER.info(userInfo.toString());
    26. }
    27. });
    28. }
    29. private static void execute(Consumer function) {
    30. SqlSession sqlSession = null;
    31. try {
    32. sqlSession = SqlSessionUtils.openSession();
    33. function.accept(sqlSession.getMapper(UserInfoMapper.class));
    34. sqlSession.commit();
    35. } finally {
    36. SqlSessionUtils.closeSession(sqlSession);
    37. }
    38. }
    39. }

    execute方法用于执行操作,方法中使用sqlSession.getMapper方法获取映射器对象,然后将映射器对象具体的执行操作委托给了Consumer对象。

    执行后的结果如下:

    从日志中可以看出,其使用了Ehcache作为二级缓存

  • 相关阅读:
    【编程题】【Scratch四级】2021.09 计算并联电阻的值
    AWS DynamoDB AWS CLI操作与编程
    【数理方程】定解问题
    性能测试知多少---系统架构分析
    山东省瞪羚企业申报时间?
    html_label标签
    Oracle-触发器和程序包
    淘宝/天猫API:item_cat_get-获得淘宝商品类目
    I420转RGB24,YUY2转RGB24,RGB24垂直翻转,RGB24水平翻转
    Java框架 Spring5--IOC
  • 原文地址:https://blog.csdn.net/m1729339749/article/details/133420967