MyBatis动态SQL

article/2025/8/21 22:38:21

在这里插入图片描述

文章目录

  • 前言
  • 一、\<if\>标签
  • 二、\<where\>标签
  • 三、\<trim\>标签
  • 四、\<set\>标签
  • 五、\<foreach\>标签
  • 五、\<sql\>标签 与 \<include\>标签


前言

动态sql是Mybatis的强大功能特性之一,能够完成不同条件下的sql拼接
在这里插入图片描述
以上是官方文档对动态SQL的介绍,简单来说动态SQL就是随着用户的输入或外部的条件的变化而变化的SQL语句,我们称为动态SQL

一、<if>标签

<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL

比如我们要查询一个用户信息,我们可能会根据id查,也可能根据username查,也可能根据id和username一起查,这时我们的查询条件就不固定了,我们该怎么实现呢?就需要借助if标签了。

在这里插入图片描述
在这里插入图片描述
这里我们使用if标签就可以很好的应对传递不同类型的参数了。
只传递id:
在这里插入图片描述
同时传递id和username:
在这里插入图片描述
只传递username:

在这里插入图片描述
我们可以发现,当我们只传递usernma就会报错(SQL语法错误),那id和username都不传呢?
在这里插入图片描述
同样会报错,那是不是就是说if标签不能使用呢?不是,因为if标签需要搭配其他标签一起来使用(where和trim),我们Mybatis中多个参数都是非必传的参数的解决方案有多种方式:
方案1. 1 == 1
在这里插入图片描述
我们在where后面加上 1 = 1后,不管参数怎么传递都不会出现where多余或者and多余的SQL语法错误
方案2:trim标签
方案3:where标签

二、<where>标签

where标签一共有两个作用:
1.当后面条件全部不成立时,会自动去掉where关键字,相当于查询全表信息
2.可以帮助我们去掉条件前面的and或or
这样可以完美的解决if标签使用时候的两种情况
在这里插入图片描述
我们再去执行,只传username:
在这里插入图片描述
我们可以发现where标签帮助我们去掉了条件前面的and,正确的执行了查询操作。
那id和username都不传呢?
在这里插入图片描述
我们可以发现where标签当if条件都不成立时帮我们去掉了where关键字
大家需要注意的是where标签会帮助我们去掉最前面的and关键字,但不会帮我们去掉最后面的and关键字

三、<trim>标签

如果我们在进行SQL操作时,如果所有的字段都是非必填时,就需要考虑使用trim标签了,结合if标签,对各个字段采取动态生成的方式。
trim标签有以下属性:
prefix:表示整个语句块,以prefix值为前缀
suffix:表示整个语句块,以suffix作为后缀
prefixOverrides:表示整个语句块要去掉的前缀
suffixOverrides:表示整个语句块要去掉的后缀
在这里插入图片描述
大家需要注意这里的prefix是否生成取决于后面的if条件是否判断成功
在这里插入图片描述
当后面条件全部判断失败时,是不会生成prefix前缀的
在这里插入图片描述
suffixOverrides会帮助我们去掉后面指定的and后缀。
大家可以根据我们的具体需求,来进行trim的四个参数的设置

四、<set>标签

set标签主要有两个作用:
1.帮助我们去掉多余的后缀,
2.如果if条件全部判断失败,去掉set
set标签主要是针对更新操作,使用set标签可以进行不定参数的更新操作。
比如说我们进行更新操作,可能更新id的username,也可能更新id的password,也可能username和password都更新
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以发现当我们只传入username后面多了个,报了SQL语法异常
在这里插入图片描述
当我们username和password都不传时,多了set也报了SQL语法异常

我们来使用set标签:
在这里插入图片描述
在这里插入图片描述
我们使用set标签后,只传username属性时,可以发现帮助我们去掉了后缀多余的,
在这里插入图片描述
我们使用set标签时,username和password都不传时,帮我们去掉了set关键字,但仍然报语法错误,这种是业务上的错误,我们不必关注,一般在Controller层就会进行处理

五、<foreach>标签

当我们想要进行批量操作时,就可以使用foreach标签,foreach标签有以下属性:
collection:绑定方法参数中的集合参数,如List,Set,Map或数组
item:遍历时的每一个元素
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串

比如我们批量删除用户:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、<sql>标签 与 <include>标签

在 MyBatis 中,我们可以使用 元素定义可重用的 SQL 片段。这些 SQL 片段可以被其他 SQL 语句引用和包含,从而减少了代码的重复编写。同时,MyBatis 还支持使用 元素将外部 SQL 片段包含到当前的 SQL 语句中。
sql和include是一对标签,配套使用的,有一个经典的使用场景,比如我们在查询的时候并不想使用select *,因为效率太低,但是数据库的字段有太多,我们每次进行写SQL的时候都特别麻烦,这时我们就可以使用sql和include标签

在这里插入图片描述
在这里插入图片描述
总之,MyBatis 中的 和 元素非常实用,能够有效地减少代码的重复编写,提高 SQL 查询语句的可维护性和可读性。需要注意的是,为了避免 SQL 注入漏洞等安全问题,我们应该尽量使用参数化查询和预编译语句,而不是直接拼接字符串。


http://chatgpt.dhexx.cn/article/iM5ZjsIl.shtml

相关文章

动态SQL

动态SQL 在项目开发中&#xff0c;动态SQL可以解决很多不确定因素导致的SQL语句不同的问题。动态SQL可以简单高效的进行编码。在接下来的案例中进行认识和学习动态SQL。 动态SQL只是在原有的SQL语句中进行细微修改。案例贴合实际&#xff0c;编码简单易懂 文章目录 动态SQL一、…

动态 SQL

文章目录 一、学习目的二、动态 SQL 中的元素三、条件查询操作四、更新操作五、复杂查询操作1.foreach 元素中的属性2.foreach 元素迭代数组3.foreach 元素迭代 List4.foreach 元素迭代 Map 一、学习目的 在实际项目的开发中&#xff0c;开发人员在使用 JDBC 或其他持久层框架…

第3章 动态SQL

目录/Contents 第3章 动态SQL学习目标掌握MyBatis中动态SQL元素的使用掌握MyBatis的条件查询操作掌握MyBatis的更新操作掌握MyBatis的复杂查询操作 学习内容1 动态SQL中的元素1.1 使用动态SQL的好处1.2 动态SQL常用元素 2 条件查询操作2.1 \<if>元素2.2 \<choose>、…

Mybatis的特性详解——动态SQL

Mybatis的特性详解——动态SQL 前言一、动态sql的元素1.MyBatis if标签&#xff1a;条件判断2.MyBatis choose、when和otherwise标签3.MyBatis where标签4.MyBatis set标签5.MyBatis foreach标签6.MyBatis bind标签7.MyBatis trim标签仰天大笑出门去&#xff0c;我辈岂是蓬蒿人…

Java编程基础八股文(背诵版)

Java语言具有哪些特点&#xff1f; Java为纯面向对象的语言。它能够直接反应现实生活中的对象。 具有平台无关性。java利用Java虚拟机运行字节码&#xff0c;无论是在Windows、Linux还是MacOS等其它平台对Java程序进行编译&#xff0c;编译后的程序可在其它平台运行。 Java为…

Java编程基础篇

目录 计算机、程序和Java概述计算机组成 基本程序设计标识符数值数据类型格式化控制台输出输入输出重定向输入重定向输出重定向输入输出重定向方法重载变量的范围 数组声明数组变量创建数组初始化数组可边长参数二维数组静态变量、常量和方法静态变量 限定字符串StringBuilder和…

Java 基础编程入门

一、什么是Java Java是一种编程语言二、应用场景 非windows平台下互联网环境的开发首选三、Java语言特点 1、应用面广 2、简单易学(相对于C/C) 3、面向对象(更符合我们看待事物的特点) 4、跨平台(一处编译&#xff0c;处处运行) 5、多线程(提升系统性能) 单线…

JAVA的编程基础(上)

1. JAVA的基本语法 1.1 注释 单行注释&#xff1a;// 多行注释&#xff1a;/* */ 文档注释&#xff1a;/** */ 注意&#xff1a;单行注释可以嵌套&#xff0c;多行注释和文档注释不可以嵌套 1.2 关键字 含义&#xff1a;在编程语言中&#xff0c;已经被赋予一些特殊含义…

Java编程基础(1)

1.Java基本语法 &#xff08;1&#xff09;Java程序的基本格式&#xff1a; 修饰符 class 类名 { 程序代码 } 如果Java程序要运行&#xff0c;则必须要有main方法&#xff0c;main方法是程序运行的入口 格式&#xff1a; 修饰符 class 类名{ public static void main&…

Java编程基础之网络编程

网络编程 文章目录 网络编程概述C/S和B/S网络通信协议网络编程要素 IP类UDP协议数据传输发送端接收端udp数据传输丢失问题 TCP概述Socket客户端ServerSocket服务端Socket**服务器代码**客户端代码 文件上传实现客户端服务端多线程版 概述 C/S和B/S 网络通信协议 协议:protoco…

java编程基础(一)二进制

文章目录 二进制面试题bit 和 bytejava 中的 byte 类型java 中 byte 类型表示正数&#xff1a;java 中 byte 类型表示负数&#xff1a; 四种整数类型的最小和最大值二进制和十进制的互转练一练java 代码中直接写二进制字面值代码仓库 二进制 对于任何已知类型的传统计算机而言…

Java 基础

Java 基础知识点整理 Java 语言是一种优秀的编程语言&#xff0c;由 C 语言、C 语言发展而来。Java 语言提供了一些有效的新特性&#xff0c;使得使用 Java 比 C 更容易写出“无错代码”。 Java特性和优点 面向对象编程的思想&#xff0c;更简单有效&#xff0c;Java 省略了 …

Java编程基础②

Java编程基础 Java中的注释Java中的标识符Java中的关键字Java中的常量常量类型定义常量 java中的变量变量的定义及其数据类型变量的类型转换变量的作用域 java运算符算术运算符赋值运算符比较运算符逻辑运算符位运算符运算符的优先级 java流程控制语句if条件语句switch条件语句…

第二章 Java编程基础

第二章 Java编程基础 目录 一&#xff0e; Java基本语法1. 基本格式2. 注释3. 标识符4. 关键字5. 常量 二&#xff0e; 变量1. 定义2. 数据类型3. 整数类型变量4. 浮点类型变量5. 字符类型变量6. 布尔类型变量7. 类型转换8. 自动提升9. 变量作用域 三&#xff0e; 运算符1. 算数…

【JAVA】1.编程基础

1.Java基本语法 JAVA基本格式&#xff1a; 修饰符 class 类名{ 程序代码 } public class java {public static void main(String[] args) {System.out.println("HelloWorld"); } public static void main(String[] args) {} &#xff08;对于初学者来说这个部分必…

第二章Java编程基础

一、填空题 1&#xff0e;Java程序代码必须放在一个类中&#xff0c;类使用class关键词定义。 2&#xff0e;Java中的注释有三类&#xff0c;分别是单行注释、多行注释、文档注释。 3&#xff0e;Java语言中&#xff0c;int类型所占存储空间为4个字节。 4&#xff0e;用于比…

Java基础 —— 编程入门

一、比特(bit)和字节(byte) 一个0或者一个1存储为一个比特(bit)&#xff0c;是计算机中最小的存储单位。计算机中是最基本的存储单元是字节(byte)。 每个字节由8个比特构成。 计算机就是一系列的电路开关。每个开关存在两种状态:关(off)和开(on)。如果电路是开的&#xff0c;它…

第二章:JAVA编程基础

目录 一&#xff1a;Java的基本语法格式 二&#xff1a;Java中的变量与常量 三&#xff1a;Java中的运算符 四&#xff1a;选择结构语句 五&#xff1a;循环结构语句 六&#xff1a;数组 一&#xff1a;Java的基本语法格式 1&#xff1a;语法格式 [修饰符] class 类名{…

Java编程基础知识(一)

目录 一.Java的基本语法 1.Java的基本语法格式 2.Java中的注释 3.Java中的关键字 Java中的标识符 二.Java中的常量与变量 1.常量 2.变量 三.Java中的运算符 四.数据输入 一.Java的基本语法 1.Java的基本语法格式 编写Java程序必须先声明一个类&#xff0c;然后再类中…

Java编程基础

目录 第一篇、Java编程基础 ❀Java中的属性名词 ❀Java数据类型 ❀转义字符 ❀&& 和 & 与 || 和 | ❀方法 第二篇、Java面向对象编程 ❀类和对象 ❀面向过程和面向对象的区别 ❀面向对象程序设计的主要特性 ❀类和对象概述 ❀对象的内存结构 ❀垃圾空间…