MyBatis 中如何使用缓存

news/2024/11/28 1:47:45/

MyBatis 中如何使用缓存

MyBatis 是一个基于 Java 的持久层框架,它提供了多种方式来使用缓存,包括一级缓存和二级缓存。本文将介绍 MyBatis 中常见的缓存使用方式及其使用方法。

在这里插入图片描述

1. 一级缓存

MyBatis 中的一级缓存是指 SqlSession 的缓存,它默认是开启的。在同一个 SqlSession 中,如果执行了相同的 SQL 语句,那么 MyBatis 会从缓存中读取结果,而不是再次向数据库发起请求。下面是一个简单的示例:

public class MyBatisTest {public static void main(String[] args) {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();try {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 第一次查询,从数据库中获取数据User user1 = userMapper.getUserById(1);System.out.println(user1);// 第二次查询,从一级缓存中获取数据User user2 = userMapper.getUserById(1);System.out.println(user2);// 更新数据,清空一级缓存user1.setName("Tom");userMapper.updateUser(user1);sqlSession.commit();// 第三次查询,从数据库中获取数据User user3 = userMapper.getUserById(1);System.out.println(user3);// 第四次查询,从一级缓存中获取数据User user4 = userMapper.getUserById(1);System.out.println(user4);} finally {sqlSession.close();}}
}

在上面的示例代码中,首先读取了配置文件 mybatis-config.xml,然后通过 SqlSessionFactoryBuilder 将配置文件解析为 SqlSessionFactory 对象,最后通过 SqlSessionFactory 创建 SqlSession 对象。在 SqlSession 中,通过 getMapper 方法获取映射器接口的实例,然后就可以直接调用映射器接口中的方法执行 SQL 语句了。在第一次查询时,会从数据库中获取数据,并将结果存储在一级缓存中。在第二次查询时,会直接从一级缓存中获取数据。在更新数据后,需要清空一级缓存,否则会出现数据不一致的情况。

2. 二级缓存

除了一级缓存外,MyBatis 还提供了二级缓存,它是 SqlSessionFactory 的缓存。在多个 SqlSession 中共享同一个二级缓存,如果执行了相同的 SQL 语句,那么 MyBatis 会从缓存中读取结果,而不是再次向数据库发起请求。下面是一个简单的示例:

public class MyBatisTest {public static void main(String[] args) {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession1 = sqlSessionFactory.openSession();SqlSession sqlSession2 = sqlSessionFactory.openSession();try {UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);// 第一次查询,从数据库中获取数据,并存储到二级缓存中User user1 = userMapper1.getUserById(1);System.out.println(user1);// 第二次查询,从二级缓存中获取数据User user2 = userMapper2.getUserById(1);System.out.println(user2);// 更新数据,清空二级缓存user1.setName("Tom");userMapper1.updateUser(user1);sqlSession1.commit();// 第三次查询,从数据库中获取数据,并存储到二级缓存中User user3 = userMapper2.getUserById(1);System.out.println(user3);// 第四次查询,从二级缓存中获取数据User user4 = userMapper1.getUserById(1);System.out.println(user4);} finally {sqlSession1.close();sqlSession2.close();}}
}

在上面的示例代码中,首先读取了配置文件 mybatis-config.xml,然后通过 SqlSessionFactoryBuilder 将配置文件解析为 SqlSessionFactory 对象,最后通过 SqlSessionFactory 创建 SqlSession 对象。在 SqlSession 中,通过 getMapper 方法获取映射器接口的实例,在多个 SqlSession 中共享同一个二级缓存。在第一次查询时,会从数据库中获取数据,并将结果存储在二级缓存中。在第二次查询时,会直接从二级缓存中获取数据。在更新数据后,需要清空二级缓存,否则会出现数据不一致的情况。

要启用二级缓存,需要在配置文件 mybatis-config.xml 中进行配置。下面是一个简单的配置示例:

<configuration><settings><setting name="cacheEnabled" value="true"/></settings><typeAliases><typeAlias type="com.example.User" alias="User"/></typeAliases><mappers><mapper resource="com/example/UserMapper.xml"/></mappers><cache type="org.apache.ibatis.cache.impl.PerpetualCache"/>
</configuration>

在上面的配置文件中,首先开启了缓存功能,然后定义了一个类型别名 User,最后定义了一个缓存实现类 org.apache.ibatis.cache.impl.PerpetualCache。

3. 自定义缓存

除了使用 MyBatis 提供的缓存实现类以外,还可以自定义缓存实现类。下面是一个简单的自定义缓存实现类示例:

public class MyCache implements Cache {private final String id;private final Map<Object, Object> cache = new HashMap<>();public MyCache(String id) {this.id = id;}@Overridepublic String getId() {return id;}@Overridepublic void putObject(Object key, Object value) {cache.put(key, value);}@Overridepublic Object getObject(Object key) {return cache.get(key);}@Overridepublic Object removeObject(Object key) {return cache.remove(key);}@Overridepublic void clear() {cache.clear();}@Overridepublic int getSize() {return cache.size();}@Overridepublic ReadWriteLock getReadWriteLock() {return null;}
}

在上面的示例代码中,实现了 MyBatis 的 Cache 接口,使用了一个 HashMap 作为缓存实现。

要使用自定义缓存,需要在配置文件 mybatis-config.xml 中进行配置。下面是一个简单的配置示例:

<configuration><settings><setting name="cacheEnabled" value="true"/></settings><typeAliases><typeAlias type="com.example.User" alias="User"/></typeAliases><mappers><mapper resource="com/example/UserMapper.xml"/></mappers><cache type="com.example.MyCache"><property name="id" value="myCache"/></cache>
</configuration>

在上面的配置文件中,首先开启了缓存功能,然后定义了一个类型别名 User,最后定义了一个缓存实现类 com.example.MyCache,并指定了缓存实现类的 id。如果没有指定 id,则默认使用缓存实现类的类名作为 id。

结论

MyBatis 提供了多种方式来使用缓存,包括一级缓存和二级缓存。一级缓存是 SqlSession 的缓存,它默认是开启的。二级缓存是 SqlSessionFactory 的缓存,需要在配置文件中进行配置。除了使用 MyBatis 提供的缓存实现类以外,还可以自定义缓存实现类。在使用缓存时,需要注意清空缓存,否则会出现数据不一致的情况。


http://www.ppmy.cn/news/841770.html

相关文章

有哪些比较好用的供应链管理系统?供应链系统好用的5大准则

阅读本文您将了解&#xff1a;1.什么是供应链管理系统&#xff1b;2.供应链管理系统主要解决哪些问题&#xff1b;3.有哪些比较好用的供应链管理系统&#xff1b;4.供应链管理系统的选择标准。 一、什么是供应链管理系统&#xff1f; 供应链管理系统&#xff08;Supply Chain …

USB Typec转HDMI方案

USB Typec转HDMI方案-AG9310,AG9311,AG9320,AG9321,几款型号是Algoltek安格科技 针对USB TYPE-C扩展坞和USB TYPE-CUSB扩展器市场需求下&#xff0c;新开发的搞性价比的方案芯片。其参数性能对比如下图所示&#xff1a;

HDMI 1.4和HDMI 2.0区别

对于HDMI1.4和HDMI2.0的关系&#xff0c;在这里我们有两个内容要弄清楚&#xff1a; 第一&#xff0c;HDMI2.0标准向下兼容&#xff0c;这样就意味着所有旧的智能网络机顶盒或者是硬盘播放器能够与新款4K电视兼容。 第二&#xff0c;HDMI2.0电缆形状与HDMI1.4电缆完全没有区别…

绿联hdmi延长器

绿联hdmi延长器不错&#xff0c;对信号有明显的放大作用。 绿联的HDMI切换器对信号没有任何放大作用&#xff0c;即使带电源的。 转载于:https://www.cnblogs.com/sayweall/p/6902490.html

mipi 转HDMI

MIPI-DSI转HDMI驱动调试(lt8912) Overview 屏的接口种类非常多&#xff0c;常见的包括RGB、HDMI、VGA、LVDS、EDP、MIPI等接口。其中&#xff0c;在Android移动设备上&#xff0c;大多采用的是MIPI接口。某些时候&#xff0c;由于某种需求&#xff0c;需要将 Android设备上的…

HDMI 1.4 协议详解

HDMI系统架构定义为由源和接收器组成。给定的设备可能具有一个或多个HDMI输入和一个或多个HDMI输出。这些设备上的每个HDMI输入都应遵循HDMI接收器的所有规则&#xff0c;每个HDMI输出应遵循HDMI源的所有规则。 如图3-1所示&#xff0c;HDMI电缆和连接器带有四个差分对&#xf…

三、HDMI与I2C

文章目录 一、HDMI接口的i2c接口二、HDMI的TMDS通道三、HDMI的DDC信号四、HDMI的热插拔检测&#xff08;HPD&#xff09; 一、HDMI接口的i2c接口 HDMI的I2C主要负责终端显示设备(如电视)与信号源设备(如笔记本)进行沟通&#xff0c;以满足HDMI协议等&#xff0c;主要用于读取E…

关于saltstack的监控系统部署

环境 master 是centos7-linux 192.14.0.79 minios 是 windows11 192.14.0.207 下载saltstack主节点 sudo yum install salt-master下载saltstack 客户端 windows的minios配置Salt-Minion-3006.1-Py3-AMD64-Setup.exe 过程 master 端 vim /etc/salt/master.d/network.conf…