MyBatis 中如何使用缓存

news2024/11/25 17:21:10

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;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void putObject(Object key, Object value) {
        cache.put(key, value);
    }

    @Override
    public Object getObject(Object key) {
        return cache.get(key);
    }

    @Override
    public Object removeObject(Object key) {
        return cache.remove(key);
    }

    @Override
    public void clear() {
        cache.clear();
    }

    @Override
    public int getSize() {
        return cache.size();
    }

    @Override
    public 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.coloradmin.cn/o/740565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 圆环统计图(带外延折线可点击)

需求先看UI效果图吧 看到这肯定去找轮子&#xff0c;找了半天&#xff0c;没找到相似的&#xff0c;大部分搜到的都是点击外凸&#xff0c;而这个UI是内凸&#xff0c;其实外凸内凸区别还不小&#xff0c;没找到一样的&#xff0c;于是乎&#xff0c;和iOS说好了要不就放弃吧&…

途乐证券-充电性能最高提升3.8倍,固态电池有新突破!

固态电池当时处于起步阶段&#xff0c;工业化仍需时刻。组织预计2030年商场空间有望达200亿元。 固态电池技能继续取得突破发展 过去10年&#xff0c;液态锂离子电池的能量密度现已提高了2倍~3倍&#xff0c;现在现已挨近理论上限。而全固态电池运用固体电解质替代了传统锂离子…

科技资讯|苹果Vision Pro预计2024年末全球发售

据彭博社记者古尔曼消息&#xff0c;苹果首款头显Vision Pro计划于2024年初在美国市场指定店铺进行开售&#xff0c;这些商店将会有专属区域用于产品演示&#xff0c;配备座位、配件和测量尺寸的工具等。知情人士透露&#xff0c;将有270家美国的苹果商店会销售Vision Pro&…

简述MySQL体系结构以及安装部署MySQL

目录 一、简述MySQL体系结构 1、连接层&#xff1a; 2、SQL层&#xff1a; 3、存储引擎层&#xff1a; 4、物理文件层&#xff1a; 5、一条SQL语句执行过程&#xff1a; 二、安装部署MySQL&#xff08;使用yum以及通用二进制方式&#xff09; 1、前期准备 1.1、关闭防火…

金九银十Java八股文面试题整理(含阿里、腾迅大厂java面试真题)

前言 看到了许多朋友在焦急的准备“金九银十”跳槽面试&#xff0c;甚至很多即将毕业的大学生都在备战秋招&#xff0c;对于学历还算优秀的大学生来说&#xff0c;这是一次离大厂最近的机会&#xff0c;毕竟是应届毕业生&#xff0c;不会对技术有非常严格的要求。 而对于工作…

注解开发配置实例

对比一下xm的配置&#xff1a; 新&#xff1a;注解开发&#xff0c;现在任何框架都有两套配置&#xff0c;一套xml配置&#xff0c;一套注解配置 现在我想把user Dao 和user serve 放到spring 中进行配置 service业务层 看到reipaositerei,就是我们Dao 层 用他来标注初始化方…

WORD模板替换,将文件给前端下载

1.word模板设计填充字段加{{填充字段名}} 2.后端依赖 <poi-tl.version>1.7.3</poi-tl.version> <poi.version>4.1.2</poi.version> <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId>&l…

基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目

功能演示 摘要&#xff1a;手势识别是一种通过技术手段识别视频图像中人物手势的技术。本文详细介绍了手势识别实现的技术原理&#xff0c;同时基于python与pyqt开发了一款带UI界面的手势识别系统软件&#xff0c;以便于进行结果显示。手势识别采用了mediapipe的深度学习算法进…

[MMDetection]绘制PR图

评价指标 平均精度与平均召回率 AP 是所有类别的平均值。传统上&#xff0c;这称为“平均精度”(mAP)。我们不区分 AP 和 mAP&#xff08;同样&#xff0c;AR 和 mAR&#xff09; APAP at IoU.50:.05:.95 (primary challenge metric)AP50AP at IoU.50 (PASCAL VOC metric)AP…

数据结构初阶--绪论

目录 一.什么是数据结构 二.什么是算法 三.算法的时间复杂度 四.算法的空间复杂度 五.复杂度练习 题一&#xff1a;消失的数字 题二&#xff1a;旋转数组 一.什么是数据结构 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 数据结构的三要素…

【LittleXi】 N-gram模型(C++实现)

LittleXi N-gram模型&#xff08;C实现&#xff09;马尔科夫性 (独立性假设)代码实现英文训练版本中文训练版本 训练效果 N-gram模型&#xff08;C实现&#xff09; 定义&#xff1a;通俗地讲&#xff0c;就是利用前文的单词&#xff0c;来推算下一个最大概率出现的单词 马尔…

Web入门-Web服务器

Web服务器是一个程序软件&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序员不必直接对程序进行操作&#xff0c;让Web开发更加便捷&#xff0c;简化web程序开发。主要功能是“通过网上信息浏览服务”。 Tomcat 概念&#xff1a;Tomcat是阿Apache软件基金会一个核心…

Coggle 30 Days of ML(23年7月)任务八:训练BILSTM模型

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务八&#xff1a;训练BILSTM模型 任务八&#xff1a;使用Word2Vec词向量&#xff0c;搭建BILSTM模型进行训练和预测 说明&#xff1a;在这个任务中&#xff0c;你将使用Word2Vec词向量&#xff0c;搭建BILSTM模型进行文…

【雕爷学编程】Arduino动手做(158)---VL53L0X激光测距模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

从零开始制作一个Web蜜罐扫描器(2)

从零开始制作一个Web蜜罐扫描器(0)_luozhonghua2000的博客-CSDN博客 从零开始制作一个Web蜜罐扫描器(1)_luozhonghua2000的博客-CSDN博客 文件读取和写入实现 上面的工作已经完成了逻辑判断的部分,下面还需要进一步完善一些旁支末节的部分因为爬虫生成的文件是一个ison文件…

熵权法 —— matlab

目录 一、熵权法介绍 二、熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 三、实例分析 1.读取数据 2.指标正向化 2.1 越小越优型处理 2.2 某点最优型指标处理 3.数据标准化 4.计算信息熵 5.计算权重 6.计算得分 总…

第三章 技术选型

1、需要考虑以下几点 可控性 必须有人可以兜底&#xff0c;可以解决 稳定性 修改的版本最好可以上下兼容 核心项目不要用最新的技术 commit的时长 是否有团队维护 适用性 更多人都会的技术 易用性 学习曲线 2、有哪些好用的移动端React组件库 3、为什么使用NestJS 1、最像…

【LeetCode: 16. 最接近的三数之和 | 双指针专题 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

港联证券|涨停不封板意味着什么?

涨停不封板或许是因为股票价格到达了涨停价&#xff0c;可是买卖量还未到达涨停板规则的要求&#xff0c;因而买卖并没有被暂停。涨停不封板也有或许是个股当天涨停之后&#xff0c;又呈现开板的状况。 总归&#xff0c;涨停不封板意味着上方的抛压较多&#xff0c;空方力气大于…

Node.js开发

Node.js是一个基于V8 JavaScript引擎的JavaScript运行时环境。 也就是说Node.js基于V8引擎来执行JavaScript的代码&#xff0c;但是不仅仅只有V8引擎&#xff1a;  前面我们知道V8可以嵌入到任何C 应用程序中&#xff0c;无论是Chrome还是Node.js&#xff0c;事实上都是嵌入…