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 注意下面的地址前面要有/。 效果: 可以在这里实现接口的测试,也可以导出文档等等。一般…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
