当前位置: 首页 > news >正文

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)]

if 标签作用:判断一个参数是否有值,如果没值,那就会隐藏 if 中的 sql

语法:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7InFxK5S-1676205611731)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675824950223.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)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wrk7OHZV-1676205611732)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675826554315.png)]


2. trim 标签

如果在某种情况下,所有的属性为非必填,那么你不知道哪个属性肯定会填上,按照 的做法,这就会导致可能某个字段后面出现“,”的问题

这就要考虑使用标签结合标签,对多个字段都采取动态⽣成的⽅式

标签作用:去除 SQL 语句前后多余的某个字符,其属性有

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qwFktzpB-1676205611732)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675827298604.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)]


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)]

传参数时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JhqMJCmA-1676205611733)(C:\Users\28463\AppData\Roaming\Typora\typora-user-images\1675829384322.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)]

<!-- 修改用户, 测试 <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)]

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 标签回顾一下&#xff0c;在上一篇 MyBatis 之三&#xff08;查询操作 占位符#{} 与 ${}、like查询、resultMap、association、collection&#xff09;中&#xff0c;学习了针对查询操作的相关知识点…...

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的瀑布流实现&#xff0c;要么根本是错的、要么就是只知其一不知其二、要么就是一充诉了一堆无用代码、要么用的是古老的MVC设计模式。 一个真正的、用户体验类似于淘宝、抖音的瀑布流怎么实现目前基本为无解。因为本人正好自己空闲时也…...

Windows PowerShell中成功进入conda虚拟环境

本人操作系统是Windows10&#xff08;输入命令cmd或在运运行中输入winver查看&#xff09;在cmd命令行中大家都很熟悉&#xff0c;很方便进入到指定创建了的虚拟环境中&#xff0c;那么在PowerShell中怎么进入呢&#xff1f;比如在VSCode中的TERMINAL使用的是PowerShell&#x…...

【C++】类与对象理解和学习(中)

专栏放在【C知识总结】&#xff0c;会持续更新&#xff0c;期待支持&#x1f339;六大默认成员函数前言每个类中都含有六大默认成员函数&#xff0c;也就是说&#xff0c;即使这个类是个空类&#xff0c;里面什么都没有写&#xff0c;但是编译器依然会自动生成六个默认成员函数…...

每日英语学习(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无法识别固态硬盘

问题描述: 这几天在装电脑&#xff0c;买了块M.2接口固态硬盘。装上去始终无法读取到硬盘&#xff0c;一开始以为是寨板Bios问题不支持M.2的设备。更新了最新的BIOS然后还是没有识别出来&#xff0c;然而将日常用的电脑PM510硬盘装上发现可以识别&#xff0c;而且日常用电脑也…...

配置Tomcat性能优化

配置Tomcat性能优化 &#x1f4d2;博客主页&#xff1a; 微笑的段嘉许博客主页 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f4…...

Hive3 安装方式详解,datagrid自定义驱动连接hive

1 Hive的安装方式 hive的安装一共有三种方式:内嵌模式、本地模式、远程模式。 元数据服务(metastore&#xff09;作用是&#xff1a;客户端连接metastore服务&#xff0c;metastore再去连接MySQL数据库来存取元数据。有了metastore服务&#xff0c;就可以有多个客户端同时连接…...

约束优化:约束优化的三种序列无约束优化方法(罚函数法)

文章目录约束优化&#xff1a;约束优化的三种序列无约束优化方法&#xff08;罚函数法&#xff09;外点罚函数法L2-罚函数法&#xff1a;非精确算法对于等式约束对于不等式约束L1-罚函数法&#xff1a;精确算法内点罚函数法&#xff1a;障碍函数法参考文献约束优化&#xff1a;…...

你真的会做APP UI自动化测试吗?我敢打赌百分之九十的人都不知道这个思路

目录 前言 一&#xff0c;开发语言选择 二&#xff0c;UI测试框架选择 1&#xff0c;Appium 2&#xff0c;Airtest 3&#xff0c;选择框架 三&#xff0c;单元测试框架选择 四&#xff0c;测试环境搭建 1&#xff0c;测试电脑选择 2&#xff0c;测试手机选择 3&#…...

GIT:【基础三】Git工作核心原理

目录 一、Git本地四个工作区域 二、Git提交文件流程 一、Git本地四个工作区域 工作目录(Working Directory)&#xff1a;电脑上存放开发代码的地方。暂存区(Stage/Index)&#xff1a;用于l临时存放改动的文件&#xff0c;本质上只是一个文件&#xff0c;保存即将提交到文件列…...

【1.12 golang中的指针】

1. 指针 区别于C/C中的指针&#xff0c;Go语言中的指针不能进行偏移和运算&#xff0c;是安全指针。 要搞明白Go语言中的指针需要先知道3个概念&#xff1a;指针地址、指针类型和指针取值。 1.1. Go语言中的指针 Go语言中的函数传参都是值拷贝&#xff0c;当我们想要修改某…...

十五.程序环境和预处理

文章目录一.程序翻译环境和执行环境1.ANSI C 标准2.程序的翻译环境和执行环境二.程序编译和链接1.翻译环境2.编译本身的几个阶段3.运行环境三.预处理1.预定义符号2.#define&#xff08;1&#xff09;#define定义标识符&#xff08;2&#xff09;#define定义宏&#xff08;3&…...

高并发系统设计之负载均衡

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录DNS负载均衡Nginx负载均衡负载均衡算法负载均衡配置超时配置被动健康检查与主动健康检查LVS/F5Nginx当我们的应用单实例不能支撑用户请求时&#xff0c;此时就需要扩容&#xff0c;从一台服务器扩容到…...

嵌入式Linux从入门到精通之第十四节:Linux IO控制技术

目录 设备控制概述 操作设备文件函数 监听文件描述符 示例 设备控制概述 对于硬件设备,Linux采用了与裸机完全不同的机制进行管理。 Linux下的所有硬件(IO、键盘、鼠标等)均是以文件的形式进行统一管理的,每个设备在/dev/目录下都有一个设备文件与之对应。操作相应的文件…...

/etc/fstab文件

文件/etc/fstab存放的是系统中的文件系统信息&#xff0c;当系统启动的时候&#xff0c;系统会自动地从这个文件读取信息&#xff0c;并且会自动将此文件中指定的文件系统挂载到指定的目录。当正确的设置了该文件&#xff0c;则可以通过mount /directoryname命令来加载一个文件…...

深度学习神经网络基础知识(一) 模型选择、欠拟合和过拟合

专栏&#xff1a;神经网络复现目录 深度学习神经网络基础知识(一) 本文讲述神经网络基础知识&#xff0c;具体细节讲述前向传播&#xff0c;反向传播和计算图&#xff0c;同时讲解神经网络优化方法&#xff1a;权重衰减&#xff0c;Dropout等方法&#xff0c;最后进行Kaggle实…...

同样做软件测试,为什么有人月入3k-5k,有人能拿到17-20k?

同样做软件测试&#xff0c;为什么有人月入3k-5k&#xff0c;有人能拿到17-20k&#xff1f; 虽然各大培训机构一直鼓吹软件测试行业薪资高&#xff0c;但是依旧有一些拿着3-5k薪资&#xff0c;甚至找不到软件测试工作的人。 先来看一些例子&#xff1a; 小A在一家培训机构学完…...

如何运行YOLOv5的代码,实现目标识别

YOLOv5和v8都由Ultralytics这家创业公司开发的https://github.com/ultralytics/yolov5环境配置git clone https://github.com/ultralytics/yolov5.git作者要求python3.6&#xff08;我用的3.8也能跑通&#xff09;torch1.7.0pip install -r requirements_my_version.txtrequire…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...