Mybatis 2

news2025/3/13 21:20:50

Mybatis 动态 SQL

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。 如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么 的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 SQL 可以彻底处理 这种痛苦。

MyBatis 中用于实现动态 SQL 的元素主要有:

If

where

trim

set

choose (when, otherwise)

foreach

If 元素

if 标签可以对传入的条件进行判断

 

where元素 

 对于查询条件个数不确定的情况,可使用元素。如下:

 

 where元素素会进行判断,如果它包含的标签中有返回值的话,它就插入一个 ‘where’。

此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉 AND 或 OR。

trim元素

where 标签,其实用 trim 也可以表示,当 WHERE 后紧随 AND 或则 OR 的 时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定 内容。

 其中prefixOverrides属性是前缀覆盖,指定内容去抹除它,而prefix属性则是增加前缀。

trim相比where使用更加灵活。

Choose 元素

 其中when,只要触发条件就执行when中的内容。若都不触发则触发otherwise内的内容。

Set 元素可以把最后一个逗号去掉

<update id="updateStudent1" parameterType="model.Student">
        update student
        <set>
            <if test="num!=null">
                 num=#{num},
            </if>
            <if test="name!=null">
                 name=#{name},
            </if>
            <if test="gender!=null">
                 gender=#{gender}
            </if>
        </set>
    </update>

如果触发指定内容,则返回标签内的内容并自动添加set标签。

比如图内代码,只触发了前两个if语句,那么第二个name后面的逗号就会自动去掉。

同样的工作上述的trim标签也可以使用。

<update id="updateStudent1" parameterType="model.Student">
        update student
        <trim prefix="set" suffixOverrides=",">
            <if test="num!=null">
                num=#{num},
            </if>
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="gender!=null">
                gender=#{gender}
            </if>
        </trim>
    </update>

suffixOverrides属性是后缀覆盖。

foreach 元素

主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach 元素的属性主要有 item,index,collection,open,separator,close。 item 表示集合中每一个元素进行迭代时的别名,index 指定一个名字,用于 表示在迭代过程中,每次迭代到的位置,open 表示该语句以什么开始, separator 表示在每次进行迭代之间以什么符号作为分隔符,close 表示以什 么结束,在使用 foreach 的时候最关键的也是最容易出错的就是 collection 属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。

– 如果传入的是单参数且参数类型是一个 List 的时候,collection 属 性值为 list。

– 如果传入的是单参数且参数类型是一个 array 数组的时候, collection 的属性值为 array。

<delete id="deleteStudents">
        delete from student where id in
        <foreach collection="list" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>

通过传入一个数组或者集合,可以自动循环实现sql删除指定范围的数据。

特殊符号处理

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

具体转义如下所示:

              特殊字符         转义字符

                

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

<select id="findStudentLs" resultType="model.Student">
        select * from student
        <trim prefix="where">
            <if test="num!=null">
                <![CDATA[num < #{num}]]>
            </if>
        </trim>
    </select>

 <![CDATA[ ] ]>是 XML 语法。在 CDATA 内部的所有内容都会被解析器忽略。

                                               !但是请注意  !

<if> </if> <where> </where>
<choose> </choose> <trim> </trim>

类似上述这种的等等标签都不会被解析,所以 我们只把有特殊字符的语句放在<![CDATA[ ] ]> 尽量减少<![CDATA[ ] ]>的范围。

mybatis一级缓存二级缓存

为什么使用缓存

缓存(cache)的作用是为了减去数据库的压力,提高查询性能。缓存实现的原理 是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)中, 当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库执行 select 语句,从而减少了对数据库的查询次数,因此提高了数据库的性能。

Mybatis 有一级缓存和二级缓存。一级缓存的作用域是同一个 SqlSession, 在同一个 sqlSession 中两次执行相同的 sql 语句,第一次执行完毕会将数据库 中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查 询,从而提高查询效率。当一个 sqlSession 结束后该 sqlSession 中的一级缓存 也就不存在了。Mybatis 默认开启一级缓存。

二级缓存是多个 SqlSession 共享的,其作用域是同一个 namespace,不同的 sqlSession 两次执行相同 namespace 下的 sql 语句且向 sql 中传递参数也相同 即最终执行相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存 (内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。 Mybatis 默认没有开启二级缓存需要在 setting 全局参数中配置开启二级缓存。

一级缓存

Mybatis 对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓 存,一级缓存只是相对于同一个 SqlSession 而言。所以在参数和 SQL 完全一样 的情况下,我们使用同一个 SqlSession 对象调用一个 Mapper 方法,往往只执 行一次 SQL,因为使用 SelSession 第一次查询后,MyBatis 会将其放在缓存中, 以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下, SqlSession 都会取出当前缓存的数据,而不会再次发送 SQL 到数据库。

 一级缓存的生命周期

MyBatis 在开启一个数据库会话时,会 创建一个新的 SqlSession 对象, SqlSession 对象中会有一个新的 Executor 对象。Executor 对象中持有一个新 的 PerpetualCache 对象,如果 SqlSession 调用了 close()方法,会释放掉一级 缓存 PerpetualCache 对象,一级缓存将不可用。

如果 SqlSession 调用了 clearCache(),会清空 PerpetualCache 对象 中的数据,但是该对象仍可使用。

SqlSession 中执行了任何一个 update 操作(update()、delete()、 insert()) ,都会清空缓存的数据,但是该对象可以继续使用。

二级缓存

二级缓存是 SqlSessionFactory 级别的,根据 mapper 的 namespace 划分区域 的,相同 namespace 的 mapper 查询的数据缓存在同一个区域,如果使用 mapper 代理方法每个 mapper 的 namespace 都不同,此时可以理解为二级缓 存区域是根据 mapper 划分。

每次查询会先从缓存区域查找,如果找不到则从数据库查询,并将查询到数据写 入缓存。Mybatis 内部存储缓存使用一个 HashMap,key 为 hashCode+sqlId+Sql 语句。value 为从查询出来映射生成的 java 对象。

sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区 域,防止脏读。

配置二级缓存配置 

第一步:启用二级缓存

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

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

第二步:对象序列化

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

第三步:配置映射文件

在 Mapper 映射文件中添加<cache/>,表示此 mapper 开启二级缓存。

当 SqlSeesion 关闭时,会将数据存入到二级缓存.

MyBatis 架构

 

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

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

相关文章

项目管理_项目整合管理

项目整合管理 一、概述 整合管理是指为确保项目中各项工作&#xff0c;能够有机地协调和配合而展开的&#xff0c;综合性和全局性的项目管理工作和过程。包括项目集成计划的制订、项目集成计划的实施和项目变动总体控制等。 其作用犹如项链中的那根线&#xff1b; 项目整体管…

MySQL —— 表的增删改查(二)

目录 表的增删改查&#xff08;二&#xff09; 一、聚合函数 1. 统计班级有多少学生 2. 统计班级收集的qq号有多少 3. 统计本次考试的数学成绩分数个数&#xff08;去重&#xff09; 4. 统计数学成绩总分 5. 统计平均总分 6. 返回英语最高分 7. 返回 >70 分以上的…

Vue3 更高效的构建工具——Vite

文章目录前言一、Vite简介1. Vite组成2.为什么选 Vite?二、Vite的优缺点vite优点vite缺点三、使用Vite创建Vue3项目1. 创建 vite 的项目2.项目的结构前言 本文讲解了构建工具 Vite&#xff0c;目前只有vue3才可以使用Vite&#xff0c;如果本文对你有所帮助请三连支持博主。 下…

落枕、肩颈酸痛,用磁疗就可缓解!

睡觉之前还是好好的&#xff0c;一觉醒来脖子莫名疼痛&#xff0c;转都转不了&#xff0c;有时候连肩膀和上肢都难受&#xff0c;很可能是“落枕”了。 落枕引起的肩颈疼痛与多种因素有关&#xff0c;如颈肩部肌肉的过度使用、不良的睡眠姿势或颈肩部受寒湿空气的侵袭&#xff…

基于RFID技术的数据中心资产智能管理系统

一、项目背景数据中心日常运维的工作核心是以合适的成本来保障业务系统不间断运行&#xff0c;充分利用资源&#xff0c;因此承载这些业务的IT资产的管理和容量(资源)的有效管理显得尤为重要。另一方面&#xff0c;容量的规划和管理也直接决定了数据中心的管理水平。然而&#…

分布式文件系统介绍与minio介绍与使用(附minio java client 使用)

&#x1f340;&#x1f340;&#x1f340;&#x1f340;分布式文件系统-minio&#xff1a; 第一章&#xff1a;分布式文件系统介绍与minio介绍与使用&#xff08;附minio java client 使用&#xff09; 文章目录1.分布式文件系统基本概念1.1 文件系统1.2 分布式文件系统1.3 分布…

hbuilderx云打包苹果证书的生成和应用上架流程

使用hbuilder或apicloud等开发工具&#xff0c;打包ios应用的时候&#xff0c;需要苹果证书&#xff0c;而这个苹果证书是需要在mac电脑创建的&#xff0c;然后再去苹果开发者中心生成。这里关键是需要mac电脑&#xff0c;但是mac电脑的价格要7000多&#xff0c;为了创建一个证…

空间剪枝:使用自适应滤波器来改进稀疏CNN的训练

论文作者 | Paul Wimmer,Jens Mehnert and Alexandru Paul Condurache论文来源 | CVPR2022文章解读 | William一、摘要非结构化的剪枝非常适合在训练和推理时减少卷积神经网络(CNN)的内存占用。标准的非结构化剪枝(Standard unstructured Pruning&#xff0c;SP)通过将滤波器元…

体验了一下 ChatGPT,连连竖大拇指

近段时间&#xff0c;ChatGPT 真的是太火了&#xff0c;我也忍不住的去体验一把。体验了之后&#xff0c;怪不得 ChatGPT 最近火爆全网了&#xff0c;看得我连连竖起了我的大拇指&#xff0c;惊艳到我了~ ChatGPT 是什么&#xff1f; ChatGPT 是一款由 OpenAl 开发的语言模型…

Linux命令大全,赶紧收藏!

新的一年 新的征程 新的课程开班 等你来学&#xff01; 本文为Linux命令大全&#xff0c;从A到Z都有总结&#xff0c;建议大家收藏以便查用&#xff0c;或者查漏补缺&#xff01; A 命令 描述 access 用于检查调用程序是否可以访问指定的文件&#xff0c;用于检查文件…

Java笔记-内部类

目录1.内部类介绍&#xff08;1&#xff09;为啥需要内部类&#xff08;2&#xff09;内部类有&#xff1a;&#xff08;2.1&#xff09;成员内部类(2.2)静态内部类&#xff08;2.3&#xff09;局部内部类&#xff08;2.4&#xff09;匿名内部类权限符修饰规则1.内部类介绍 A类…

Linux尚硅谷

Linuxlinuxlinux课程介绍Linux进阶之路Linux基础篇交互虚拟机网络连接三种形式配置网络vmtools安装介绍vmtaools安装与使用Linux目录结构总结一下Linux实操篇远程登陆Linux系统xftp的安装和配置解决xftp中文乱码情况vi和vim编译器vi和vim常见三种模式三种模式相互转换vi与vim快…

NoSQL数据库详细介绍

一、NoSQL发展历史 NoSQL 一词最早出现于 1998 年&#xff0c;是 Carlo Strozzi 开发的一个轻量、开源、不提供 SQL 功能的关系数据库。 2009 年&#xff0c;Last.fm 的 Johan Oskarsson 发起了一次关于分布式开源数据库的讨论&#xff0c;来自 Rackspace 的 Eric Evans 再次…

我也就是尝试了一下斗图的快乐

Hi&#xff0c;本章继续分享爬虫内容。上一章的内容在后续有做了更新&#xff0c;可以将指定的搜索内容一爬到底&#xff1a;https://gitee.com/qinganan_admin/reptile-case.git 欢迎来个⭐ 先来看看图 好家伙&#xff0c;如此一来斗图我都能一挑十。 本章分享内容来自每周学…

手动将jar包导入maven中,并通过maven坐标导入

目录标题一、获取需要的jar包二、将jar导入maven三、在maven项目中使用刚刚导入的jar一、获取需要的jar包 已有jar包忽略此步骤&#xff01;&#xff01;&#xff01; 去maven仓库下载获取。 这里先复制maven依赖坐标。 <!-- https://mvnrepository.com/artifact/org.sp…

Leetcode力扣秋招刷题路-0036

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 36. 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现…

塔式太阳能热发电系统的防雷设计

太阳能能源是来自太阳的氢原子核在超高温时聚变释放的巨大能量&#xff0c;目前人类所需能量的绝大部分都直接或间接地来自太阳。太阳能将成为本世纪最主要的能源之一&#xff0c;这是因为太阳能既蕴藏丰富&#xff0c;又是安全、干净的&#xff0c;不会威胁人类和破坏环境。太…

互联网架构之 “高可用” 详解

一、什么是高可用 高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。 假设系统一直能够提供服务&#xff0c;我们说系统的可用性是100%。 如果系统每运行…

分布式新闻项目实战 - 10.Long类型精度丢失问题

怒发冲冠&#xff0c;凭阑处、潇潇雨歇。抬望眼&#xff0c;仰天长啸&#xff0c;壮怀激烈。三十功名尘与土&#xff0c;八千里路云和月。莫等闲、白了少年头&#xff0c;空悲切。 靖康耻&#xff0c;犹未雪。臣子恨&#xff0c;何时灭。驾长车&#xff0c;踏破贺兰山缺。壮志饥…

SpringBoot——Banner介绍

一、什么是BannerBanner即横幅标语&#xff0c;我们在启动SpringBoot项目时会将Banner信息打印至控制台。我们可以输出一些图形、SpringBoot版本信息等内容。默认情况下是通过实现类SpringBootBanner输出的Banner内容&#xff0c;默认的输出内容如下。二、自定义Banner如果不想…