【MyBatis】转义符+缓存机制

news2024/11/13 15:00:34

目录

一. 特殊符号处理

二. MyBatis缓存机制

1. 什么是缓存? 

2. 一级缓存

3. 二级缓存


一. 特殊符号处理

1. 在 mybatis 中的 xml 文件,一些特殊符号需要转译:

    <!--转义字符   " <" 号会报错,">" 号不会报错  -->
    <select id="teachers" resultType="Teacher">
        select * from teacher where age &lt; 30
    </select>

2. 使用 <![CDATA[]]>  

通过 <![CDATA[ 特殊字符 ]]> 包裹特殊字符也可以

    <select id="teachers" resultType="Teacher">
        select * from teacher where age <![CDATA[<]]> 30
    </select>

注意:

  •  " <" 号会报错,">" 号不会报错;
  • 如果<![CDATA[ ]]> 里有<if> </if> <where> </where><choose> </choose> <trim> </trim> 等这些标签都不会被解析,所以只把有特殊字符的语句放在 <![CDATA[ ]]> 尽量缩小<![CDATA[ ]]>的范围。 

二. MyBatis缓存机制

1. 什么是缓存? 

缓存 (Cache):是一种用于临时存储数据的技术,将数据临时存储在内存中。

缓存的作用:让数据离我们的执行程序更近,让程序能够快速的获取到数据,减少对数据库的访问压力。

缓存的主要类型有:

  1. CPU缓存:处理器内置的缓存,分为L1、L2和L3级别,存储经常使用的指令和数据,减少处理器访问主内存的时间。

  2. 硬盘缓存:硬盘驱动器内部的缓存,暂存读写数据,以提高数据传输速度。

  3. Web缓存:在浏览器或代理服务器中缓存网页内容,以减少网络请求次数,加快页面加载速度。

  4. 数据库缓存:在数据库中使用缓存技术,存储查询结果,以加速数据库的响应时间。

➱ MyBatis 提供了一级缓存和二级缓存来提高数据库查询的性能。

2. 一级缓存

MyBatis一级缓存默认是SqlSession级别的,在同一个SqlSession中查询到数据先缓存到SqlSession对象中,第二次查询数据时,先从SqlSession中查询,如果有直接返回,没有再去查询数据库。

代码演示:

Mapper接口:

Teacher findTeacherById(int id);

 sql语句:

    <select id="findTeacherById" resultType="Teacher">
         select * from teacher where id = #{id}
    </select>

测试代码: (重复查询三次id为1的老师信息)

    @Test
    public void test() throws IOException {
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sessionFactory.openSession();
        TeacherDao teacherDao = sqlSession.getMapper(TeacherDao.class);
        Teacher teacher1 = teacherDao.findTeacherById(1);
        Teacher teacher2 = teacherDao.findTeacherById(1);
        Teacher teacher3 = teacherDao.findTeacherById(1);
        System.out.println(teacher1);
        System.out.println(teacher2);
        System.out.println(teacher3);
        sqlSession.close();

    }

打印日志:(日志中只显示一条查询)

一级缓存失效的情况:

  • sqlSession.close();
  • sqlSession.clearCache();
  • SqlSession 中执行了任何一个修改操作(update()、delete()、insert()) ,都会清空缓存的数据。

3. 二级缓存

•  MyBatis二级缓存是SqlSessionFactory级别的,可以让多个SqlSession共享数据。

•  MyBatis默认没有开启二级缓存,使用时需要配置并手动开启

•  若开启了二级缓存,当SqlSession关闭时,会将一级缓存中的数据存储到二级缓存中,其他的SqlSession就可以从二级缓存中查询到之前SqlSession查询的数据。

要开启二级缓存,需要进行以下步骤

  1. 在 MyBatis 全局配置文件中的<settings>标签中配置开启二级缓存,设置cacheEnabledtrue(默认值就是true,也可以省略这一步)
  2. 在具体的 mapper.xml 文件中添加<cache/>标签。
  3. 被缓存的 POJO(实体类)必须实现序列化接口(implements Serializable

 

测试:

    @Test
    public void test() throws IOException {
        SqlSession sqlSession1 = MyBatisUtil.getSQlSession();
        TeacherDao teacherDao1 = sqlSession1.getMapper(TeacherDao.class);
        Teacher teacher1 = teacherDao1.findTeacherById(1);
        System.out.println(teacher1);
        sqlSession1.close();
        
        SqlSession sqlSession2 = MyBatisUtil.getSQlSession();
        TeacherDao teacherDao2 = sqlSession2.getMapper(TeacherDao.class);
        Teacher teacher2 = teacherDao2.findTeacherById(1);
        System.out.println(teacher2);
        sqlSession2.close();
    }

二级缓存的特点包括:

  • mapper 映射文件中的所有 select 语句将会被缓存。
  • mapper 映射文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 二级缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响。
  • 如果在加入<cache>标签的前提下让个别 select 元素不使用缓存,可以使用useCache属性,设置为false
  • 缓存默认使用最近最少使用(LRU)算法来收回。
  • 根据时间表,如noFlushInterval(没有刷新间隔),缓存不会以任何时间顺序来刷新。
  • 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
  • 缓存会被视为是可读/可写(read/write)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,不干扰其他调用者或线程所做的潜在修改。

<cache>标签还有一些可选属性,用于更精细地控制缓存行为,例如:

  • eviction:缓存的回收策略,默认是lru(最近最少使用,移除最长时间不被使用的对象),还可以选择fifo(先进先出,按对象进入缓存的顺序来移除它们)、soft(软引用,移除基于垃圾回收器状态和软引用规则的对象)、weak(弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象)。
  • flushInterval:缓存刷新间隔,设置一个毫秒值表示多长时间清空一次缓存,默认不清空。
  • readonly:是否只读,true(只读)表示 MyBatis 认为所有从缓存中获取数据的操作都是只读操作,不会修改数据,这样可以加快获取数据的速度;false(读写,默认)表示 MyBatis 觉得获取的数据可能会被修改,会利用序列化或反序列化的技术克隆一份新的数据,速度相对较慢。
  • size:缓存存放元素的数量。
  • type:指定自定义缓存的全类名(实现Cache接口即可)。


    本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见 

    海漫浩浩,我亦苦作舟!大家一起学习,一起进步!   本人微信:g2279605572(欢迎大家与我交流 )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079211.html

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

相关文章

哪个软件可以把试卷扫描成空白卷?这几款很不错

哪个软件可以把试卷扫描成空白卷&#xff1f;在数字化学习日益普及的今天&#xff0c;将试卷扫描成空白卷成为了许多教师和学生提升学习效率的重要手段。传统的扫描仪不仅体积庞大、操作复杂&#xff0c;而且成本高昂&#xff0c;不太适合个人用户。那么要怎么做呢&#xff1f;…

图纸文件怎么加密,六款图纸加密软件推荐

在现代设计与工程领域&#xff0c;图纸和设计文件的安全性至关重要。无论是建筑设计、机械工程还是电子电路图&#xff0c;图纸泄露都可能造成无法估量的损失。因此&#xff0c;选择一款可靠的图纸加密软件是保护知识产权的首要任务。在本文中&#xff0c;我们将推荐六款备受好…

尚硅谷Java面试题第四季-Java基本功

1.服务可用性多少个9是什么意思&#xff1f; 2.Arrays.asList()把数组转换成集合大坑 代码&#xff1a; public class Arrays_BugDemo {public static void main(String[] args){List<Integer> list Arrays.asList(1,2);list.add(3);list.forEach(System.out::println…

【Notion的一些简单介绍】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

鸿蒙位置服务

位置服务 1、首先申请权限 在module.json5文件下申请位置权限 "requestPermissions": [{"name": "ohos.permission.LOCATION", // 权限名称,为系统已定义的权限"reason": "$string:location_reason", // 申请权限的原因,…

别让病毒毁了你的数据,用户必备的ClamAV扫描神器!

背景 在Linux环境中&#xff0c;尽管由于其独特的权限管理和文件系统结构使得病毒感染的概率较低&#xff0c;但为了确保系统的安全性&#xff0c;尤其是在处理共享文件或邮件服务器时&#xff0c;安装和使用病毒扫描工具依然至关重要。ClamAV是一款开源的防病毒软件&#xff…

KPaaS:微服务架构下的持续集成与部署(CI/CD)应用实践

在微服务架构下&#xff0c;CI/CD&#xff08;持续集成/持续部署&#xff09;已经成为软件开发过程中的一项关键实践。这种实践不仅提高了开发团队的工作效率&#xff0c;还确保了软件的质量和安全性。通过将代码更改频繁地集成到主分支&#xff0c;开发团队可以更早地发现潜在…

oppo手机短信删除了怎么恢复?可用这2个恢复方法

日常使用OPPO手机时&#xff0c;如果不慎删除了重要的短信&#xff0c;怎么办&#xff1f;oppo手机短信删除了怎么恢复&#xff1f;今天小编就分享2种简单的恢复办法&#xff0c;帮大家找回那些被误删的短信。 方法一&#xff1a;通过oppo手机的云端备份服务恢复短信 OPPO手机…

1259:【例9.3】求最长不下降序列 动态规划

1259&#xff1a;【例9.3】求最长不下降序列 题目链接 【输入样例】 【输入样例】 14 13 7 9 16 38 24 37 18 44 19 21 22 63 15【输出样例】 max8 7 9 16 18 19 21 22 63思路&#xff1a; 确定状态&#xff1a; a[n]数组放数据&#xff0c; dp[n]数组放第i个位子前最长子序…

产品经理如何提升系统思考能力

很多工作年限比较短的产品经理&#xff0c;分析问题的时候最初看到的都是单点&#xff0c;只有积累了足够的经验和阅历后&#xff0c;才能看到单点之外的“全局”&#xff0c;才会慢慢形成自己的系统思考能力&#xff0c;才会提高自己的认知能力。 产品经理如果想往更高层面发…

nacos配置持久化到Mysql数据库

Nacos持久化配置&#xff08;Mac版本&#xff09; 一&#xff1a;生成持久化nacos数据的表 找到mysql-schema.sql表(如下图)&#xff0c;里面全部内容直接在mysql库中执行&#xff0c;生成表。 mysql-schema.sql位置&#xff1a; nacos/distribution/target/nacos-server-2.…

erlang学习:gen_server书上案例22.6练习题5

检查是否有懒惰的工人&#xff0c;也就是接受工作但不按时完成的进程。把任务请求函数修改为 返回{JobNumber, JobTime, F}&#xff0c;其中JobTime是工人必须完成任务的秒数。如果工人在JobTime 1时还未完成任务&#xff0c;服务器就应当向其发送一个hurry_up&#xff08;快点…

创建视频说明书二维码的具体步骤(三步操作)

原创二维码教程&#xff0c;2024.8.27&#xff0c;长沙 视频说明书二维码是一种创新且有效的工具&#xff0c;能够为用户提供直观的操作指导和使用体验&#xff0c;广泛应用于各种场景中。 1.电子产品说明书 手机、平板和电脑&#xff1a;在包装盒内或产品说明书上加入视频二…

kkfileview最新源码编译+部署+踩坑问题

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等&#xff0c;其开源免费&#xff0c;且…

2535. 解密 [CSP-J 2022]

代码 #include <bits/stdc.h> using namespace std; long long m,n; int check(int x){if(x * (m - x) n) return 0;if(x * (m - x) < n) return 1;if(x * (m - x) > n) return 2; } int main(){int k;cin >> k;while(k--){long long e, d,p0,q0;scanf(&q…

脑靶向肽 ;SHp ;CLEVSRKNC ;缺血归巢肽

【脑靶向肽 SHp 简介】 SHp多肽是一种抗肿瘤多肽&#xff0c;它可以通过激活P53基因&#xff0c;调节细胞凋亡相关基因的蛋白表达&#xff0c;从而抑制肿瘤细胞的增殖并诱导细胞凋亡。在最新的研究中&#xff0c;SHp多肽被发现可以促进T细胞对肿瘤细胞的杀伤作用&#xff0c;显…

【C++】提示并输入一个字符串,统计该字符串中字母个数、数字个数、空格个数、其他字符的个数

1、提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 only只是一个简单的小练习 #include <iostream> #include <string>using namespace std;int main() {string str; //定义一个字符串类型cout<…

《黑神话》的成功只是开始,国产3A拿什么和氪金游戏对抗?

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2240.html 《黑神话&#xff1a;悟空》作为国产3A游戏的代表&#xff0c;虽然在品质和口碑上取得了巨大成功&#xff0c;但其盈利能力相较于国产氪金游戏仍有一定差距。根…

PG_RMAN 部署与使用

PG_RMAN 简介&#xff1a; pg_rman是一款开源的备份恢复软件,支持在线和基于PITR的备份恢复方式。 pg_rman类似于 oracle的rman,可以进行全量、增量、归档日志的备份。 pg_rman特点: 使用简单,一个命令即可完成备份和恢复支持在线全备、增量、归档日志备份支持备份压缩。支持自…

基于深度学习的番茄成熟度检测系统(含UI界面、yolov5、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov5、yolov5 SE注意力机制&#xff0c;两个模型都已训练好&#xff0c;可直接使用。 数据集&#xff1a;     网上下载的数据集&#xff0c;格式都已转好&#xff0c;可…