MyBatis 之四(动态SQL之 if、trim、where、set、foreach 标签)
文章目录
- 动态 SQL
- 1. if 标签
- 2. trim 标签
- 3. where 标签
- 4. set 标签
- 5. foreach 标签
回顾一下,在上一篇 MyBatis 之三(查询操作 占位符#{} 与 ${}、like查询、resultMap、association、collection)中,学习了针对查询操作的相关知识点,理解了占位符 #{}与 ${}的区别,还有 like 查询要使用 concat() 进行拼接,针对字段名称和属性名不同时要使用resultMap,重点学习了一对一查询用 association,一对多查询用 collection 以及这两个标签对应属性的学习
本篇将学习 MyBatis 强大特性之一的动态 SQL
动态 SQL
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
1. if 标签
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYOZDImX-1676205611731)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675824562270.png)]](https://img-blog.csdnimg.cn/dc707330d89d470d8cf93d20951cf3e6.png)
if 标签作用:判断一个参数是否有值,如果没值,那就会隐藏 if 中的 sql
![语法:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7InFxK5S-1676205611731)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675824950223.png)]](https://img-blog.csdnimg.cn/f5ceee8538d14b129348f0ead7ab1fcc.png)
<!-- 添加用户(测试 <if> 标签),photo 是非必传参数 -->
<insert id="add2">insert into userinfo(username,password<if test="photo!=null">,photo</if>) values(#{name},#{password}<if test="photo!=null">,#{photo}</if>)
</insert>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oASMZXim-1676205611731)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675826233789.png)]](https://img-blog.csdnimg.cn/857dbd7d0aa04be5a79238beb6958720.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wrk7OHZV-1676205611732)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675826554315.png)]](https://img-blog.csdnimg.cn/5e5da273dc7c42ecba8bf151b80c5d86.png)
2. trim 标签
如果在某种情况下,所有的属性为非必填,那么你不知道哪个属性肯定会填上,按照 的做法,这就会导致可能某个字段后面出现“,”的问题
这就要考虑使用标签结合标签,对多个字段都采取动态⽣成的⽅式
标签作用:去除 SQL 语句前后多余的某个字符,其属性有
- prefix:表示整个语句块,以prefix的值作为前缀
- suffix:表示整个语句块,以suffix的值作为后缀
- prefixOverrides:表示整个语句块要去除掉的前缀
- suffixOverrides:表示整个语句块要去除掉的后缀
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qwFktzpB-1676205611732)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675827298604.png)]](https://img-blog.csdnimg.cn/4487f912ba6647c1a36484f2dc742890.png)
<!-- 添加用户,其中 username、password、photo 都是非必传参数 -->
<insert id="add3">insert into userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="name!=null">username,</if><if test="password!=null">password,</if><if test="photo!=null">photo</if></trim>values<trim prefix="(" suffix=")" suffixOverrides=","><if test="name!=null">#{name},</if><if test="password!=null">#{password},</if><if test="photo!=null">#{photo}</if></trim>
</insert>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5SS3BMbe-1676205611732)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675828299302.png)]](https://img-blog.csdnimg.cn/ce71408f9dd84b9da176aaae68562fb3.png)
3. where 标签
where 标签作用:实现查询中的 where 替换,它可以实现如果没有任何的查询条件,那么它可以隐藏查询中的 where sql,但如果存在查询条件,那么会生成 where 的sql 查询,并且使用 where 标签可以自动的去除最前面的一个 and 字符
<!-- 根据 id 查询用户 -->
<select id="getUserById" resultMap="BaseMap">select * from userinfo<where><if test="id!=null">and id=#{id}</if></where>
</select>
不传参数时
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-INCbnfuP-1676205611732)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675828929067.png)]](https://img-blog.csdnimg.cn/c8ccd6eca042450495bdcf56e370e792.png)
传参数时
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JhqMJCmA-1676205611733)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675829384322.png)]](https://img-blog.csdnimg.cn/fd50cdea25d54769b547984454f1bd2e.png)
where 标签也可以使⽤ trim prefix=“where” prefixOverrides=“and” 替换
4. set 标签
set 标签作用:进行修改操作时,配合 if 来处理非必传参数的,它的特点是会自动去除最后一个英文逗号
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y65XJKkL-1676205611733)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675830578023.png)]](https://img-blog.csdnimg.cn/a91d49371d3f480088b24808686c6e60.png)
<!-- 修改用户, 测试 <set> 标签 -->
<update id="update2">update userinfo<set><if test="name!=null">username=#{name},</if><if test="password!=null">password=#{password},</if><if test="photo!=null">photo=#{photo}</if></set>where id=#{id}
</update>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2FUGpdnU-1676205611733)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675831267788.png)]](https://img-blog.csdnimg.cn/08dc3f40bd994a84b784f6c0df6bd930.png)
set标签也可以使⽤ trim prefix=“set” suffixOverrides=“,” 替换
5. foreach 标签
标签作用:对集合进行循环的。其属性
- collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
- item:遍历时的每⼀个对象
- open:语句块开头的字符串
- close:语句块结束的字符串
- separator:每次遍历之间间隔的字符串
<!-- 删除用户,测试 <foreach> 标签 -->
<delete id="delIds">delete from userinfo where id in <foreach collection="ids" open="(" close=")" item="id" separator=",">#{id}</foreach>
</delete>

相关文章:
MyBatis 之四(动态SQL之 if、trim、where、set、foreach 标签)
文章目录动态 SQL1. if 标签2. trim 标签3. where 标签4. set 标签5. foreach 标签回顾一下,在上一篇 MyBatis 之三(查询操作 占位符#{} 与 ${}、like查询、resultMap、association、collection)中,学习了针对查询操作的相关知识点…...
PAT (Advanced Level) Practice 1006 Sign In and Sign Out
1006 Sign In and Sign Out题目翻译代码分数 25作者 CHEN, Yue单位 浙江大学At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing in’…...
Android入门第64天-MVVM下瀑布流界面的完美实现-使用RecyclerView
前言 网上充满着不完善的基于RecyclerView的瀑布流实现,要么根本是错的、要么就是只知其一不知其二、要么就是一充诉了一堆无用代码、要么用的是古老的MVC设计模式。 一个真正的、用户体验类似于淘宝、抖音的瀑布流怎么实现目前基本为无解。因为本人正好自己空闲时也…...
Windows PowerShell中成功进入conda虚拟环境
本人操作系统是Windows10(输入命令cmd或在运运行中输入winver查看)在cmd命令行中大家都很熟悉,很方便进入到指定创建了的虚拟环境中,那么在PowerShell中怎么进入呢?比如在VSCode中的TERMINAL使用的是PowerShell&#x…...
【C++】类与对象理解和学习(中)
专栏放在【C知识总结】,会持续更新,期待支持🌹六大默认成员函数前言每个类中都含有六大默认成员函数,也就是说,即使这个类是个空类,里面什么都没有写,但是编译器依然会自动生成六个默认成员函数…...
每日英语学习(11)大英复习单词和翻译
2023.2.20 单词 1.contemplate 思考、沉思 2.spark 激起 3.venture 冒险 4.stunning 极好的 5.dictate 影响 6.diplomatic 外交的 7.vicious 恶性的 8.premier 首要的 9.endeavor 努力 10.bypass 绕过 11.handicaps 不利因素 12.vulnerable 脆弱的 13.temperament 气质、性格…...
x79主板M.2无法识别固态硬盘
问题描述: 这几天在装电脑,买了块M.2接口固态硬盘。装上去始终无法读取到硬盘,一开始以为是寨板Bios问题不支持M.2的设备。更新了最新的BIOS然后还是没有识别出来,然而将日常用的电脑PM510硬盘装上发现可以识别,而且日常用电脑也…...
配置Tomcat性能优化
配置Tomcat性能优化 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! Ǵ…...
Hive3 安装方式详解,datagrid自定义驱动连接hive
1 Hive的安装方式 hive的安装一共有三种方式:内嵌模式、本地模式、远程模式。 元数据服务(metastore)作用是:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接…...
约束优化:约束优化的三种序列无约束优化方法(罚函数法)
文章目录约束优化:约束优化的三种序列无约束优化方法(罚函数法)外点罚函数法L2-罚函数法:非精确算法对于等式约束对于不等式约束L1-罚函数法:精确算法内点罚函数法:障碍函数法参考文献约束优化:…...
你真的会做APP UI自动化测试吗?我敢打赌百分之九十的人都不知道这个思路
目录 前言 一,开发语言选择 二,UI测试框架选择 1,Appium 2,Airtest 3,选择框架 三,单元测试框架选择 四,测试环境搭建 1,测试电脑选择 2,测试手机选择 3&#…...
GIT:【基础三】Git工作核心原理
目录 一、Git本地四个工作区域 二、Git提交文件流程 一、Git本地四个工作区域 工作目录(Working Directory):电脑上存放开发代码的地方。暂存区(Stage/Index):用于l临时存放改动的文件,本质上只是一个文件,保存即将提交到文件列…...
【1.12 golang中的指针】
1. 指针 区别于C/C中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 要搞明白Go语言中的指针需要先知道3个概念:指针地址、指针类型和指针取值。 1.1. Go语言中的指针 Go语言中的函数传参都是值拷贝,当我们想要修改某…...
十五.程序环境和预处理
文章目录一.程序翻译环境和执行环境1.ANSI C 标准2.程序的翻译环境和执行环境二.程序编译和链接1.翻译环境2.编译本身的几个阶段3.运行环境三.预处理1.预定义符号2.#define(1)#define定义标识符(2)#define定义宏(3&…...
高并发系统设计之负载均衡
本文已收录至Github,推荐阅读 👉 Java随想录 文章目录DNS负载均衡Nginx负载均衡负载均衡算法负载均衡配置超时配置被动健康检查与主动健康检查LVS/F5Nginx当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到…...
嵌入式Linux从入门到精通之第十四节:Linux IO控制技术
目录 设备控制概述 操作设备文件函数 监听文件描述符 示例 设备控制概述 对于硬件设备,Linux采用了与裸机完全不同的机制进行管理。 Linux下的所有硬件(IO、键盘、鼠标等)均是以文件的形式进行统一管理的,每个设备在/dev/目录下都有一个设备文件与之对应。操作相应的文件…...
/etc/fstab文件
文件/etc/fstab存放的是系统中的文件系统信息,当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。当正确的设置了该文件,则可以通过mount /directoryname命令来加载一个文件…...
深度学习神经网络基础知识(一) 模型选择、欠拟合和过拟合
专栏:神经网络复现目录 深度学习神经网络基础知识(一) 本文讲述神经网络基础知识,具体细节讲述前向传播,反向传播和计算图,同时讲解神经网络优化方法:权重衰减,Dropout等方法,最后进行Kaggle实…...
同样做软件测试,为什么有人月入3k-5k,有人能拿到17-20k?
同样做软件测试,为什么有人月入3k-5k,有人能拿到17-20k? 虽然各大培训机构一直鼓吹软件测试行业薪资高,但是依旧有一些拿着3-5k薪资,甚至找不到软件测试工作的人。 先来看一些例子: 小A在一家培训机构学完…...
如何运行YOLOv5的代码,实现目标识别
YOLOv5和v8都由Ultralytics这家创业公司开发的https://github.com/ultralytics/yolov5环境配置git clone https://github.com/ultralytics/yolov5.git作者要求python3.6(我用的3.8也能跑通)torch1.7.0pip install -r requirements_my_version.txtrequire…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
