【MyBatis】day03动态SQL和缓存机制

简介: 【MyBatis】day03动态SQL和缓存机制

第九章 Mybatis动态SQL【重点】

SQL中注释

//方式一

-- 1=1

//方式二【推荐使用】

<!-- 1=1 -->

9.1 动态SQL概述

  • 动态SQL指的是:SQL语句可动态化
  • Mybatis的动态SQL中支持OGNL表达式语言,OGNL( Object Graph Navigation Language )对象图导航语言

9.2 常用标签

  • if标签:用于完成简单的判断
  • where标签:用于解决where关键字及where后第一个and或or的问题
  • trim标签: 可以在条件判断完的SQL语句前后添加或者去掉指定的字符
  • prefix: 添加前缀
  • prefixOverrides: 去掉前缀
  • suffix: 添加后缀
  • suffixOverrides: 去掉后缀
  • set标签:主要用于解决set关键字及多出一个【,】问题
  • choose标签:类似java中if-else【switch-case】结构
  • foreach标签:类似java中for循环
  • collection: 要迭代的集合
  • item: 当前从集合中迭代出的元素
  • separator: 元素与元素之间的分隔符
  • open: 开始字符
  • close:结束字符
  • sql标签:提取可重用SQL片段

9.3 示例代码

1. <?xml version="1.0" encoding="UTF-8" ?>
2. <!DOCTYPE mapper
3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5. 
6. <mapper namespace="com.atguigu.mybatis.mapper.EmployeeMapper">
7. <sql id="emp_col">
8.         id,
9.         last_name,
10.         email,
11.         salary
12. </sql>
13. <sql id="select_employee">
14.         select
15.             id,
16.             last_name,
17.             email,
18.             salary
19.         from
20.             tbl_employee
21. </sql>
22. <!-- 按条件查询员工信息【条件不确定】-->
23. <select id="selectEmpByOpr" resultType="employee">
24. <include refid="select_employee"></include>
25. <where>
26. <if test="id != null">
27.                and id = #{id}
28. </if>
29. <if test="lastName != null">
30.                 and last_name = #{lastName}
31. </if>
32. <if test="email != null">
33.                 and email = #{email}
34. </if>
35. <if test="salary != null">
36.                 and salary = #{salary}
37. </if>
38. </where>
39. </select>
40. 
41. <select id="selectEmpByOprTrim" resultType="employee">
42. <include refid="select_employee"></include>
43. <trim prefix="where" suffixOverrides="and">
44. <if test="id != null">
45.                 id = #{id} and
46. </if>
47. <if test="lastName != null">
48.                 last_name = #{lastName} and
49. </if>
50. <if test="email != null">
51.                 email = #{email} and
52. </if>
53. <if test="salary != null">
54.                 salary = #{salary}
55. </if>
56. </trim>
57. </select>
58. 
59. <update id="updateEmpByOpr">
60.         update
61.             tbl_employee
62. <set>
63. <if test="lastName != null">
64.                 last_name=#{lastName},
65. </if>
66. <if test="email != null">
67.                 email=#{email},
68. </if>
69. <if test="salary != null">
70.                 salary=#{salary}
71. </if>
72. </set>
73.         where
74.             id = #{id}
75. </update>
76. 
77. 
78. <select id="selectEmpByOneOpr" resultType="employee">
79.         select
80. <include refid="emp_col"></include>
81.         from
82.             tbl_employee
83. <where>
84. <choose>
85. <when test="id != null">
86.                     id = #{id}
87. </when>
88. <when test="lastName != null">
89.                     last_name = #{lastName}
90. </when>
91. <when test="email != null">
92.                     email = #{email}
93. </when>
94. <when test="salary != null">
95.                     salary = #{salary}
96. </when>
97. <otherwise>
98.                     1=1
99. </otherwise>
100. </choose>
101. </where>
102. </select>
103. 
104. <select id="selectEmpByIds" resultType="employee">
105.         select
106.             id,
107.             last_name,
108.             email,
109.             salary
110.         from
111.             tbl_employee
112. <where>
113.             id in(
114. <foreach collection="ids" item="id" separator=",">
115.                 #{id}
116. </foreach>
117.             )
118. </where>
119. 
120. </select>
121. 
122. <insert id="batchInsertEmp">
123.         INSERT INTO
124.             tbl_employee(last_name,email,salary)
125.         VALUES
126. <foreach collection="employees" item="emp" separator=",">
127.                 (#{emp.lastName},#{emp.email},#{emp.salary})
128. </foreach>
129. </insert>
130. </mapper>

第十章 Mybatis中缓存机制

10.1 缓存概述

  • 生活中缓存
  • 缓存一些音频、视频优势
  • 节约数据流量
  • 提高播放性能
  • 程序中缓存【Mybatis缓存】
  • 使用缓存优势
  • 提高查询效率
  • 降低服务器压力

10.2 Mybatis中的缓存概述

  • 一级缓存
  • 二级缓存
  • 第三方缓存

10.3 Mybatis缓存机制之一级缓存

  • 概述:一级缓存【本地缓存(Local Cache)或SqlSession级别缓存】
  • 特点
  • 一级缓存默认开启
  • 不能关闭
  • 可以清空
  • 缓存原理
  • 第一次获取数据时,先从数据库中加载数据,将数据缓存至Mybatis一级缓存中【缓存底层实现原理Map,key:hashCode+查询的SqlId+编写的sql查询语句+参数】
  • 以后再次获取数据时,先从一级缓存中获取,如未获取到数据,再从数据库中获取数据。
  • 一级缓存五种失效情况
  1. 不同的SqlSession对应不同的一级缓存
  2. 同一个SqlSession但是查询条件不同
  3. 同一个SqlSession两次查询期间执行了任何一次增删改操作
  • 清空一级缓存
  1. 同一个SqlSession两次查询期间手动清空了缓存
  • sqlSession.clearCache()
  1. 同一个SqlSession两次查询期间提交了事务
  • sqlSession.commit()

10.4 Mybatis缓存机制之二级缓存

  • 二级缓存【second level cache】概述
  • 二级缓存【全局作用域缓存】
  • SqlSessionFactory级别缓存
  • 二级缓存特点
  • 二级缓存默认关闭,需要开启才能使用
  • 二级缓存需要提交sqlSession或关闭sqlSession时,才会缓存。
  • 二级缓存使用的步骤:
    ① 全局配置文件中开启二级缓存<setting name="cacheEnabled" value="true"/>
    ② 需要使用二级缓存的映射文件处使用cache配置缓存<cache />
    ③ 注意:POJO需要实现Serializable接口
    关闭sqlSession或提交sqlSession时,将数据缓存到二级缓存
  • 二级缓存底层原理
  • 第一次获取数据时,先从数据库中获取数据,将数据缓存至一级缓存;当提交或关闭SqlSession时,将数据缓存至二级缓存
  • 以后再次获取数据时,先从一级缓存中获取数据,如一级缓存没有指定数据,再去二级缓存中获取数据。如二级缓存也没有指定数据时,需要去数据库中获取数据,......
  • 二级缓存相关属性
  • eviction=“FIFO”:缓存清除【回收】策略。
  • LRU – 最近最少使用的:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • flushInterval:刷新间隔,单位毫秒
  • size:引用数目,正整数
  • readOnly:只读,true/false
  • 二级缓存的失效情况
  • 在两次查询之间,执行增删改操作,会同时清空一级缓存和二级缓存
  • sqlSession.clearCache():只是用来清除一级缓存。

10.5 Mybatis中缓存机制之第三方缓存

  • 第三方缓存:EhCache
  • EhCache 是一个纯Java的进程内缓存框架
  • 使用步骤
  • 导入jar包
1. <!-- mybatis-ehcache -->
2. <dependency>
3. <groupId>org.mybatis.caches</groupId>
4. <artifactId>mybatis-ehcache</artifactId>
5. <version>1.0.3</version>
6. </dependency>
7. 
8. <!-- slf4j-log4j12 -->
9. <dependency>
10. <groupId>org.slf4j</groupId>
11. <artifactId>slf4j-log4j12</artifactId>
12. <version>1.6.2</version>
13. <scope>test</scope>
14. </dependency>
  • 编写配置文件【ehcache.xml】
1. <?xml version="1.0" encoding="UTF-8"?>
2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3. xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
4. <!-- 磁盘保存路径 -->
5. <diskStore path="E:\mybatis\ehcache" />
6. 
7. <defaultCache
8. maxElementsInMemory="512"
9. maxElementsOnDisk="10000000"
10. eternal="false"
11. overflowToDisk="true"
12. timeToIdleSeconds="120"
13. timeToLiveSeconds="120"
14. diskExpiryThreadIntervalSeconds="120"
15. memoryStoreEvictionPolicy="LRU">
16. </defaultCache>
17. </ehcache>
  • 加载第三方缓存【映射文件】
  • 开始使用
  • 注意事项
  • 第三方缓存,需要建立在二级缓存基础上【需要开启二级缓存,第三方缓存才能生效】
  • 如何让第三方缓存失效【将二级缓存设置失效即可】


相关文章
|
6天前
|
SQL 数据可视化 关系型数据库
MCP与PolarDB集成技术分析:降低SQL门槛与简化数据可视化流程的机制解析
阿里云PolarDB与MCP协议融合,打造“自然语言即分析”的新范式。通过云原生数据库与标准化AI接口协同,实现零代码、分钟级从数据到可视化洞察,打破技术壁垒,提升分析效率99%,推动企业数据能力普惠化。
56 3
|
2月前
|
存储 缓存 NoSQL
mybatisplus一二级缓存
MyBatis-Plus 继承并优化了 MyBatis 的一级与二级缓存机制。一级缓存默认开启,作用于 SqlSession,适用于单次会话内的重复查询;二级缓存需手动开启,跨 SqlSession 共享,适合提升多用户并发性能。支持集成 Redis 等外部存储,增强缓存能力。
|
6月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
5月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
661 0
|
5月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
979 0
|
4月前
|
缓存 Java 数据库连接
Mybatis一级缓存详解
Mybatis一级缓存为开发者提供跨数据库操作的一致性保证,有效减轻数据库负担,提高系统性能。在使用过程中,需要结合实际业务场景选择性地启用一级缓存,以充分发挥其优势。同时,开发者需注意其局限性,并做好事务和并发控制,以确保系统的稳定性和数据的一致性。
147 20
|
4月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
323 5
|
6月前
|
缓存 Java 数据库连接
Mybatis一级缓存、二级缓存详讲
本文介绍了MyBatis中的查询缓存机制,包括一级缓存和二级缓存。一级缓存基于同一个SqlSession对象,重复查询相同数据时可直接从缓存中获取,减少数据库访问。执行`commit`操作会清空SqlSession缓存。二级缓存作用于同一namespace下的Mapper对象,支持数据共享,需手动开启并实现序列化接口。二级缓存通过将数据存储到硬盘文件中实现持久化,为优化性能,通常在关闭Session时批量写入缓存。文章还说明了缓存的使用场景及注意事项。
200 7
Mybatis一级缓存、二级缓存详讲
|
6月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
6月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。