MyBatis:动态 SQL 标签
MyBatis
- 动态 SQL 标签
- if 标签
- where 标签
- trim 标签
- choose 、when 、otherwise 标签
- foreach 标签
- 附

动态 SQL 标签
MyBatis 动态 SQL 标签,是一组预定义的标签,用于构建动态的 SQL 语句,允许在 SQL 语句中使用条件、循环和迭代等逻辑。通过使用动态 SQL 标签,开发者可以根据不同的条件和参数生成不同的 SQL 语句,实现更加灵活的数据访问操作。但是,需要谨慎处理 SQL 注入问题,确保所有的输入都经过正确的验证和转义处理,以防止安全漏洞的产生。
常用的动态 SQL 标签
- if 标签:根据条件判断是否包含 SQL 语句片段
- where 标签:根据条件控制 SQL 语句的查询条件部分
- trim 标签:根据条件去除或添加字符串前后的特定字符
- choose 、when 、otherwise 标签:根据条件选择不同的 SQL 语句片段
- foreach 标签:在 SQL 语句中迭代一个集合
简单示例:
首先,创建一张数据表 dynamic_sql_object
表结构如图:

表信息如图:

接着,创建与数据表一一映射的实体类 DynamicSqlObject
package cn.edu.MyBatisDemo.model;public class DynamicSqlObject {private int id;private String name;private String grade;private int age;private String phone;public DynamicSqlObject() {super();}public DynamicSqlObject(int id, String name, String grade, int age, String phone) {this.id = id;this.name = name;this.grade = grade;this.age = age;this.phone = phone;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "DynamicSqlObject{" +"id=" + id +", name='" + name + '\'' +", grade='" + grade + '\'' +", age=" + age +", phone='" + phone + '\'' +'}';}
}
然后,创建一个接口 DynamicSqlObjectMap ,声明获取指定用户信息的方法。同时,创建映射文件 DynamicSqlObjectMap.xml 实现接口方法
package cn.edu.MyBatisDemo.mapper;import cn.edu.MyBatisDemo.model.DynamicSqlObject;
import org.apache.ibatis.annotations.Param;public interface DynamicSqlObjectMap {//加上 @Param() 注解防止抛出异常---ReflectionException: There is no getter for property named 'xxx'public DynamicSqlObject getObject(@Param("name") String name,@Param("phone") String phone); // 获取指定用户信息
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 每个标签示例中再补充 -->
<mapper namespace="cn.edu.MyBatisDemo.mapper.DynamicSqlObjectMap"><select id="getObject" resultType="dynamicSqlObject" >SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object`</select>
</mapper>
最后,测试结果,对每个标签进行简单示例
if 标签
在上面的示例中,select 标签定义了一个名为 getObject 的查询语句,其结果类型为 DynamicSqlObject 。
在 SQL 语句中,首先可以使用 WHERE 1=1 来构建一个通用的条件,然后使用 if 标签根据不同的条件来添加额外的限制条件。在 if 标签中,使用 test 属性来判断条件是否满足,若满足则执行该标签内的 SQL 语句片段;若不满足则不执行。

结果如图:
传递的参数值为 {name: “曹操”, phone: null} ,则生成的 SQL 语句为
SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE 1=1 AND `name`= '曹操'

where 标签
在 where 标签中,可以根据不同的条件动态生成不同的 WHERE 子句,从而灵活地执行数据库查询操作。在 where 标签内使用 if 标签来添加条件语句。

结果如图:
传递的参数值为 {name: “曹操”, phone: “13625987401”} ,则生成的 SQL 语句为
SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `name`= '曹操' AND `phone`= '13625987401'

注:where 标签只可以去掉第一个条件语句中前面的 AND 或 OR
trim 标签
在 trim 标签中,可以在动态 SQL 语句中去除前缀或后缀,也可以在 select 、update 或 insert 标签中使用。
trim 标签属性
- prefix:添加前缀
- prefixOverrides:去除前缀
- suffix:添加后缀
- suffixOverrides:去除后缀

结果如图:
传递的参数值为 {name: “曹操”, phone: “13625987401”} ,则生成的 SQL 语句为
SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `name`= '曹操' AND `phone`= '13625987401'

choose 、when 、otherwise 标签
choose、when、otherwise 标签是一组标签,配合使用。choose 标签包含多个 when 标签和一个 otherwise 标签。在 when 标签中,使用 test 属性来判断条件是否满足,若满足则执行该标签内的 SQL 语句片段;若没有任何条件满足,则 otherwise 标签内的 SQL 语句片段作为默认的语句片段执行。

结果如图:
传递的参数值为 {name: “曹操”, phone: “15489723601”} ,则生成的 SQL 语句为
SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `name`= '曹操'

注:
条件选择:在 when、otherwise 标签中,当多个条件都满足时,只选择最前面的一条 SQL 语句片段执行(从上往下的顺序)
条件判断:在 if 标签中,当多个条件都满足时,所有满足条件的 SQL 语句片段都会执行
foreach 标签
foreach 标签适用于遍历集合、批量操作的情况。
foreach 标签属性
- collection:指定的集合
- item:指定集合的每一个值的迭代变量
- separator:在生成的 SQL 语句中,每个元素之间的分隔符
- open:在生成的 SQL 语句中,需要在 IN 子句或 BETWEEN 子句的前面添加的字符串
- close:在生成的 SQL 语句中,需要在 IN 子句或 BETWEEN 子句的后面添加的字符串
foreach 标签示例中还需要再声明一个批量获取指定用户信息的方法。同时,在映射文件 DynamicSqlObjectMap.xml 中实现该接口方法

<select id="getObjectByIds" resultType="dynamicSqlObject" >SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `id` IN<foreach collection="ids" item="id" separator="," open="(" close=")" >#{id}</foreach>
</select>
结果如图:
传递的参数值为 {20230830,20230832} ,则生成的 SQL 语句为
SELECT `id`,`name`,`grade`,`age`,`phone` FROM `dynamic_sql_object` WHERE `id` IN(20230830,20230832)

附
set 标签用在更新的操作上,在 SQL 语句中动态生成多个 SET 子句。在 set 标签内使用多个 if 标签来判断哪些属性需要更新或不做处理。

sql 标签用于定义可重用的 SQL 片段,方便在不同的地方复用。include 标签用于将另一个映射文件中定义的 SQL 片段引入到当前映射文件中。这两个标签配合使用,可以减少重复的 SQL 代码,提高代码的可维护性和可读性。

bind 标签用于动态地生成 SQL 语句的绑定变量。
相关文章:
MyBatis:动态 SQL 标签
MyBatis 动态 SQL 标签if 标签where 标签trim 标签choose 、when 、otherwise 标签foreach 标签附 动态 SQL 标签 MyBatis 动态 SQL 标签,是一组预定义的标签,用于构建动态的 SQL 语句,允许在 SQL 语句中使用条件、循环和迭代等逻辑。通过使…...
福建农林大学 html +css + JavaScript 期末复习 -- 保姆级
html css JavaScript 期末复习(保姆级复盘) 考试题型 1、选择题 20题 30分 2、判断题 15题 15分 3、程序题 3 题 30分 4、综合题 2 题 25分 1、网页第一代文本标签(直接上代码,看保姆级注解) <!-- doctype: docum…...
推箱子小游戏
--print("开发流程步骤:I、绘制推箱子地图并初始化 ----- 几*几大小的地图 \n\n II、根据宏定义和推箱子地图上的数字来选择不同的图形\n\n III、获取玩家坐标 -----------重点\n\n …...
Spring简介
一:Spring是什么 Spring是分层的Java SE/EE应用full-stack(各层都有对应解决方案)轻量级(api较少,学习成本较低)开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp…...
万德高科携手航天科技AIRIOT打造智慧能碳管理平台, 助力碳达峰碳中和
“十四五”时期,我国生态文明建设进入了以降碳为重点战略方向、推动减污降碳协同增效、促进经济社会发展全面绿色转型、实现生态环境质量改善由量变到质变的关键时期。“实施数字化赋能行动”,聚焦能源管理、节能降碳、低碳能力等典型场景,推…...
金融软件开发的 4 大挑战
与大多数行业一样,金融行业不断发展,同样给软件和解决方案开发带来了挑战。虽然这些挑战并不独特,也不新颖,但是随着时间的推移,金融体系越来越复杂,这些挑战的影响也越来越大。 在上一篇文章中࿰…...
oppo 手机刷机流程
一、操作步骤: 一)解锁BootLoader 以下是一种常见的方法,可以尝试获取OPPO手机的Root权限(以参考信息为准,具体步骤可能因设备型号和系统版本而有所不同): 11). 解锁Bootloader:首…...
SQL---数据抽样
内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…...
C 库函数 - strxfrm()
描述 C 库函数 size_t strxfrm(char *dest, const char *src, size_t n) 根据程序当前的区域选项中的 LC_COLLATE 来转换字符串 src 的前 n 个字符,并把它们放置在字符串 dest 中。 声明 下面是 strxfrm() 函数的声明。 size_t strxfrm(char *dest, const char …...
选型前必看,CRM系统在线演示为什么重要?
在CRM挑选环节中,假如企业需要深入了解CRM管理系统的功能和功能,就需要CRM厂商提供在线演示。简单的说,就是按照企业的需要,检测怎样通过CRM进行。如今我们来谈谈CRM在线演示的作用。 在线演示 1、了解CRM情况 熟悉系统功能&…...
微软官宣放出一个「小模型」,仅2.7B参数,击败Llama2和Gemini Nano 2
就在前一阵谷歌深夜炸弹直接对标 GPT-4 放出 Gemini 之后,微软这两天也紧锣密鼓进行了一系列动作。尽管时间日趋圣诞假期,但是两家巨头硬碰硬的军备竞赛丝毫没有停止的意思。 就在昨日,微软官宣放出一个“小模型” Phi-2,这个 Ph…...
成为一名FPGA工程师:面试题与经验分享
在现代科技领域,随着数字电子技术的迅猛发展,FPGA(可编程逻辑器件)工程师成为了备受瞩目的职业之一。FPGA工程师不仅需要掌握硬件设计的基本原理,还需要具备良好的编程能力和解决问题的实践经验。面对如此竞争激烈的行…...
关于“Python”的核心知识点整理大全35
目录 13.3.4 重构 create_fleet() game_functions.py 13.3.5 添加行 game_functions.py alien_invasion.py 13.4 让外星人群移动 13.4.1 向右移动外星人 settings.py alien.py alien_invasion.py game_functions.py 13.4.2 创建表示外星人移动方向的设置 13.4.3 检…...
C++ opencv RGB三通道提升亮度
#include <iostream> #include <iomanip> #include<opencv2//opencv.hpp> using namespace std; using namespace cv; //函数adjustBrightness用于图片增加亮度 void adjustBrightness(cv::Mat& image, int targetBrightness) { // 获取图像的通道数…...
TCAX特效字幕保姆入门教程+效果演示+软件源码自取
目录 介绍 下载链接 初步使用 软件使用 tcc文件介绍 tcc文件版本 模式设置 编辑 k值提供方式举例 特效脚本设置 主要设置 ass全局风格设置 额外设置 常见问题 编码使用 使用其他tcax博主的进行编码测试 介绍 TCAX是一款专门用于制作特效字幕的软件。通过TCAX…...
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐宏offsetof计算偏移量结构体传参
文章目录 📝前言🌠 结构体内存对齐🌉内存对齐包含结构体的计算🌠宏offsetof计算偏移量🌉为什么存在内存对⻬?🌠 结构体传参🚩总结 📝前言 本小节,我们学习结构的内存对…...
活动回顾 (上) | 2023 Meet TVM 系列活动完美收官
作者:xixi 编辑:三羊、李宝珠 2023 Meet TVM 年终聚会于 12 月 16 日在上海圆满落幕,本次 meetup 不仅邀请到了 4 位 AI 编译器专家为大家带来了精彩的分享,还新增了圆桌讨论环节,以更多元的视角和各位共同讨论大模型…...
JMeter常见配置及常见问题修改
一、设置JMeter默认打开字体 1、进入安装目录:apache-jmeter-x.x.x\bin\ 2、找到 jmeter.properties,打开。 3、搜索“ languageen ”,前面带有“#”号.。 4、去除“#”号,并修改为:languagezh_CN 或 直接新增一行&…...
描述一个bug及定义bug的级别
(一)描述一个bug 描述一个bug,需要以下几个因素: 故障标题、故障发现的版本、故障类别(功能/兼容/界面)、故障优先级、故障描述(测试环境、测试步骤、预期结果、实际结果)。 举个例…...
Java项目-瑞吉外卖项目优化Day3
前后端分离开发 Yapi 是一个接口结合了接口测试、接口管理的管理平台,需要配置比较麻烦。看弹幕说用apifox更好用。可以将接口文档导出导入。 Swagger 注意下面的地址前面要有/。 效果: 可以在这里实现接口的测试,也可以导出文档等等。一般…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
