Java框架myBatis(三)

devtools/2024/10/22 10:42:21/

 一、特殊符号转义

特殊符号处理 在mybatis中的xml文件中,存在一些特殊的符号,比如:、"、&、<> 等,正常书写mybatis会报错,需要对这些符号进行转义。

具体转义如下所示: 特殊字符 转义字符

除了可以使用上述转义字符外,还可以使用来包裹特殊字符。如 下所示:

        <!CDATA[       ]>是XML语法。在CDATA内部的所有内容都会被解析器忽略。 但是有个问题那就是<if>、<where>、<choose>等这些标签都不会被解析,所以 我们只把有特殊字符的语句放在<!CDATA[       ]>尽量缩小 的范围。

二、myBatis缓存

1、缓存

        缓存:数据缓存,让数据离我们执行程序更近,  让程序可以快速的获取到数据

        手机缓存、浏览器缓存、cpu缓存等

        当访问量过大时,会将数据库中的数据先存入缓存(第一次查询后先不销毁,保存在java对象中,相对时间再进行销毁 ),对数据库进行保护,减少访问量过大

 存入缓存一般有两大极端:一种是短期时间内访问量极大、一种是修改可能性极小 

        查询流程:先从缓存中查数据,缓存中如果没有则从数据库查询,数据库查询后把数据存入缓存,下次直接从缓存中获取、

2、  myBatis一级缓存      

        默认是SqlSession级别的,在同一个SqlSession中查询的数据存入SqlSession对象中 .第二次查询数据时,先从sqlSession对象中查询,如果有则直接返回,如果没有再连接数据库

        一级缓存生命周期:开始于sqlSession对象,结束语sqlSession对象关闭。如果在此期间执行了新增修改删除,也会清空sqlSession对象中的缓存数据。调用sqlSession中的clearCache()方法也会强制清空一级缓存数据

java">@Select("select id,name,gender from teacher where id = #{id}")Teacher findTeacherById(Integer id);
java">@Testpublic void test4(){SqlSession sqlSession = MyBatisUtil.getSqlSession();TeacherDao teacherDao = sqlSession.getMapper(TeacherDao.class);Teacher teacher = teacherDao.findTeacherById(4);Teacher teacher1 = teacherDao.findTeacherById(4);System.out.println(teacher);System.out.println(teacher1);sqlSession.commit();sqlSession.close();}

 两个结果

 

只执行了一次 

 

3、  myBatis二级缓存

二级缓存是SqlSessionFactory级别的,多个SqlSession共享的,其作用域是同一个namespace。不同的 sqlSession 两次执行相同namespace下的sql语句且向sql中传递参数也相同 即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存 (内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。

Mybatis 默认没有开启二级缓存需要配置开启二级缓存。

配置开启二级缓存需要三步:

1、启用二级缓存

在SqlMapperConfig.xml 中启用二级缓存,如下代码所示,当 cacheEnabled 设置为true时启用二级缓存,设置为false时禁用二级缓存。

<setting name="cacheEnabled" value="true"/>

2、对象序列化 

将所有的POJO类实现序列化接口Java.io.Serializable

3、配置映射文件 

在Mapper映射文件中添加<cache>标签,表示此mapper开启二级缓存。 当SqlSeesion 关闭时,会将数据存入到二级缓存  属性flushInterval可以设置销毁时间,毫秒为单位 。cache可以设置其他属性,包括是否只读,销毁策略等,详情请见API

,详情请见API

 mybatis – MyBatis 3 | XML 映射器

只查询了一次


http://www.ppmy.cn/devtools/104669.html

相关文章

关于几道计算机网络题的解答

2017年12月28日&#xff0c;星期四&#xff0c; 照片上的第一题中多项式的指数看不清&#xff0c;但没关系&#xff0c;就现在的情形&#xff0c;说一下大概的思路&#xff0c;参考着再结合题目中实际的参数&#xff0c;再套一遍就能把题目解出来了&#xff0c; 假设&#xf…

Java算法之堆排序(Heap Sort)

堆排序简介 堆排序是一种基于比较的排序算法&#xff0c;它使用二叉堆数据结构来实现。二叉堆是一种特殊的完全二叉树&#xff0c;其中每个父节点的键值都大于&#xff08;或等于&#xff09;其子节点的键值&#xff08;大顶堆&#xff09;&#xff0c;或者小于&#xff08;或…

Qt: QComboBox

示例1&#xff1a;隐藏某一个下拉选项&#xff0c;并不改变索引序号 //QComboBox::view() 方法返回的是 QListView 类型的指针&#xff0c;表示 QComboBox 中下拉列表的视图部分。 QListView* listView static_cast<QListView*>(ui->combo_box_initial_guess->vi…

从自动驾驶看无人驾驶叉车的技术落地和应用

摘 要 &#xff5c; 介绍无人驾驶叉车在自动驾驶技术中的应用&#xff0c;分析其关键技术&#xff0c;如环境感知、定位、路径规划等&#xff0c;并讨论机器学习算法和强化学习算法的应用以提高无人叉车的运行效率和准确性。无人叉车在封闭结构化环境、机器学习、有效数据集等方…

在使用React Hooks中,如何避免状态更新时的性能问题?

在React Hooks中避免状态更新时的性能问题&#xff0c;可以采取以下一些最佳实践&#xff1a; 避免不必要的状态更新&#xff1a; 使用React.memo、useMemo、和useCallback来避免组件或其子组件进行不必要的渲染。 使用useMemo&#xff1a; 对于基于状态或props的复杂计算&…

单片机内存区域划分

目录 一、C 语言内存分区1、栈区2、堆区3、全局区&#xff08;静态区&#xff09;4、常量区5、代码区6、总结 二、单片机存储分配1、存储器1.1 RAM1.2 ROM1.3 Flash Memory1.4 不同数据的存放位置 2、程序占用内存大小 一、C 语言内存分区 C 语言在内存中一共分为如下几个区域…

【ceph学习】ceph如何进行数据的读写(2)

本章摘要 上文说到&#xff0c;librados/IoctxImpl.cc中调用objecter_op和objecter的op_submit函数&#xff0c;进行op请求的封装、加参和提交。 本文详细介绍相关函数的调用。 osdc中的操作 初始化Op对象&#xff0c;提交请求 设置Op对象的时间&#xff0c;oid&#xff0c…

【 OpenHarmony 系统应用源码魔改 】-- Launcher 之「桌面布局定制」

前言 阅读本篇文章之前&#xff0c;有几个需要说明一下&#xff1a; 调试设备&#xff1a;平板&#xff0c;如果你是开发者手机&#xff0c;一样可以加 Log 调试&#xff0c;源码仍然是手机和平板一起分析&#xff1b;文章中的 Log 信息所显示的数值可能跟你的设备不一样&…