Mybatis常用动态 SQL 相关标签
1. <if>
用于条件判断,当满足条件时执行对应的 SQL 片段。
示例:
<select id="findUser" resultType="User">SELECT * FROM usersWHERE 1=1<if test="name != null and name != ''">AND name = #{name}</if><if test="age != null and age != ''">AND age = #{age}</if>
</select>
上述示例中,如果name不为null,并且不为空时,则拼接条件name进行查询。即if条件判断为true时,才进行name拼接查询
2. <where>
自动处理 WHERE 子句中的逻辑,避免手动拼接 AND 或 OR 导致的 SQL 错误。
- 如果
<where>内部没有任何内容,则不会生成WHERE。 - 自动移除第一个条件前多余的
AND或OR。
示例:
<select id="findUser" resultType="User">SELECT * FROM users<where><if test="name != null and name != ''">AND name = #{name}</if><if test="age != null and age != ''">AND age = #{age}</if></where>
</select>
3. <set>
用于更新操作时动态生成 SET 子句,自动处理逗号分隔符。
- 如果
<set>内部没有任何内容,则不会生成SET。 - 自动移除最后一个逗号。
示例:
<update id="updateUser">UPDATE users<set><if test="name != null and name != ''">AND name = #{name}</if><if test="age != null and age != ''">AND age = #{age}</if></set>WHERE id = #{id}
</update>
4. <choose>、<when>、<otherwise>
类似于 Java 中的 switch 或 if-else 语句,用于多条件分支判断。
示例:
<select id="findUser" resultType="User">SELECT * FROM users<where><choose><when test="name != null and name != ''">name = #{name}</when><when test="email != null and email != ''">email = #{email}</when><otherwise>age > 0</otherwise></choose></where>
</select>
上述示例中:
如果name不为空,则根据name查询
如果name不为空且email不为空,则根据email查询
如果name和email都为空,则查询age大于0的
5. <trim>
用于自定义动态 SQL 的前缀和后缀,可以灵活控制生成的 SQL。
prefix:在SQL前添加内容。suffix:在生成 SQL语句后添加内容。prefixOverrides:移除指定的前缀(如多余的AND或OR)。suffixOverrides:移除指定的后缀。
示例:
<select id="findUser" resultType="User">SELECT * FROM users<trim prefix="WHERE" prefixOverrides="AND |OR"><if test="name != null and name != ''">AND name = #{name}</if><if test="age != null and age != ''">AND age = #{age}</if></trim>
</select>
6. <foreach>
用于遍历集合,常用于 IN 查询或批量插入。
collection:指定要遍历的集合名称。item:集合中的每个元素的别名。open:遍历开始的字符。close:遍历结束的字符。separator:集合项之间的分隔符。
示例:
<select id="findUsersByIds" resultType="User">SELECT * FROM usersWHERE id IN<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
</select>
批量插入示例:
<insert id="batchInsert">INSERT INTO users (name, age)VALUES<foreach collection="list" item="user" separator=",">(#{user.name}, #{user.age})</foreach>
</insert>
7. <bind>
用于在 SQL 中创建变量,通常结合其他标签使用,比如正则表达式匹配。
示例:
<select id="findUserByLike" resultType="User"><bind name="pattern" value="'%' + _parameter + '%'" />SELECT * FROM usersWHERE name LIKE #{pattern}
</select>
8. <sql> 和 <include>
用于定义可重用的 SQL 片段。
<sql>:定义 SQL 片段。<include>:引用已定义的 SQL 片段。
示例:
<sql id="userColumns">id, name, age, email
</sql><select id="findUser" resultType="User">SELECT <include refid="userColumns" /> FROM usersWHERE id = #{id}
</select>
总结
| 标签 | 功能描述 |
|---|---|
<if> | 条件判断 |
<where> | 自动生成 WHERE 子句 |
<set> | 自动生成 SET 子句 |
<choose> | 多条件分支判断 |
<trim> | 自定义前缀和后缀 |
<foreach> | 遍历集合,适用于 IN 查询或批量操作 |
<bind> | 创建变量 |
<sql> | 定义可重用的 SQL 片段 |
<include> | 引用已定义的 SQL 片段 |
通过这些标签,MyBatis 可以灵活地生成动态 SQL,满足复杂的业务需求。
相关文章:
Mybatis常用动态 SQL 相关标签
1. <if> 用于条件判断,当满足条件时执行对应的 SQL 片段。 示例: <select id"findUser" resultType"User">SELECT * FROM usersWHERE 11<if test"name ! null and name ! ">AND name #{name}</if><if…...
AWQ和GPTQ量化的区别
一、前言 本地化部署deepseek时发现,如果是量化版的deepseek,会节约很多的内容,然后一般有两种量化技术,那么这两种量化技术有什么区别呢? 二、量化技术对比 在模型量化领域,AWQ 和 GPTQ 是两种不同的量…...
ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?
目录 基于ESP32S3:解决RWDT无法触发中断问题引言解决方案1. 查看报错日志2. 分析报错及一步一步找到解决方法3.小结我的源码基于ESP32S3:解决RWDT无法触发中断问题 引言 在嵌入式系统中,RWDT(看门狗定时器)是确保系统稳定性的重要组件。然而,在某些情况下,RWDT可能无法…...
基于SpringBoot的民宿管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
go 日志框架
内置log import ("log""os" )func main() {// 设置loglog.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)// 自定义日志前缀log.SetPrefix("[pprof]")log.Println("main ..")// 如果用format就用PrintF,而不是…...
如何在 PDF 文件中嵌入自定义数据
由于 PDF 文件格式功能强大且灵活,它经常被用于内部工作流程。有时候,将自定义数据嵌入 PDF 文件本身会非常有用。通常,这些信息会被大多数工具忽略,因此 PDF 仍然可以作为普通 PDF 文件正常使用。 以下是一些实现方法࿱…...
计算机毕业设计SpringBoot+Vue.js服装商城 服装购物系统(源码+LW文档+PPT+讲解+开题报告)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
22.回溯算法4
递增子序列 这里不能排序,因为数组的顺序是对结果有影响的,所以只能通过used数组来去重 class Solution { public:vector<int> path;vector<vector<int>> res;void backtracking(vector<int>& nums,int start){if(path.si…...
linux -对文件描述符的操作dup、fcntl有五种
dup #include<unistd.h> int dup(int oldfd);作用:复制一个新的文件描述符fd 3, int fd1 dup(fd);f指向的是a.txt,fd1指向的也是a.txt从空闲的文件描述符表中找一个最小的作为新的拷贝的文件描述符返回:成功返回新的文件描述符,失败…...
技术解析 | 适用于TeamCity的Unreal Engine支持插件,提升游戏构建效率
龙智是JetBrains授权合作伙伴、Perforce授权合作伙伴,为您提供TeamCity、Perforce Helix Core等热门的游戏开发工具及一站式服务 TeamCity 是游戏开发的热门选择,大家选择它的原因包括支持 Perforce、可以进行本地安装,并提供了多种配置选项。…...
Ubuntu22.04 - brpc的安装和使用
目录 介绍安装使用 介绍 brpc 是用 c语言编写的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统 安装 先安装依赖 apt-get install -y git g make libssl-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev libgflags-d…...
网络运维学习笔记 018 HCIA-Datacom综合实验02
文章目录 综合实验2sw3:sw4:gw:core1(sw1):core2(sw2):ISP 综合实验2 sw3: vlan 2 stp mode stp int e0/0/1 port link-type trunk port trunk allow-pass v…...
Vulhub靶机 Apache Druid(CVE-2021-25646)(渗透测试详解)
一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 1、漏洞范围 在Druid0.20.0及更低版本中 二、访问靶机IP 8888端口 1、点击Load data进入新界面后,再点击local disk按钮。 2、进入新界面后,在标红框的Base directory栏写上…...
VSCode配置自动生成头文件
一、配置步骤: 1.打开命令面板(CtrlShiftp): 2.输入snippets 选择配置代码片段 3. 选择新建全局代码片段 输入文件名,比如header_cpp(随便定义),然后点击键盘回车按钮,得到下面这个文件。 增加配置文…...
Xcode如何高效的一键重命名某个关键字
1.选中某个需要修改的关键字; 2.右击,选择Refactor->Rename… 然后就会出现如下界面: 此时就可以一键重命名了。 还可以设置快捷键。 1.打开Settings 2.找到Key Bindings 3.搜索rename 4.出现三个,点击一个地方设置后其…...
React 高阶组件的优缺点
React 高阶组件的优缺点 优点 1. 代码复用性高 公共逻辑封装:当多个组件需要实现相同的功能或逻辑时,高阶组件可以将这些逻辑封装起来,避免代码重复。例如,多个组件都需要在挂载时进行数据获取操作,就可以创建一个数…...
(五)趣学设计模式 之 建造者模式!
目录 一、 啥是建造者模式?二、 为什么要用建造者模式?三、 建造者模式怎么实现?四、 建造者模式的应用场景五、 建造者模式的优点和缺点六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方…...
香橙派/树莓派 利用Wiring库 使用GPIO模拟PWM
香橙派或者树莓派 等开发板,本身带有硬件PWM,比如香橙派3 lts版,但是这个引脚不符合我的项目需求,我需要外接一个电机,在检测到人脸的时候 转动,但是这个硬件引脚,只要上电就开始输出pwm 信号,导…...
全面收集中间件Exporter适配:从Redis到ActiveMQ,掌握监控数据采集的最佳实践
#作者:任少近 文章目录 说明:一 Redis的适配exporter版1.1 Redis的exporter源码版本1.2 Redis的exporter的releases版1.3 Redis_exporter版本选择理由1.4 Redis_exporter docer镜像 二 Zookeeper的适配exporter版2.1 Zookeeper的exporter源码版本2.2 Zo…...
机器学习数学通关指南——链式法则
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一、定义与公式 链式法则&a…...
Word怎么给文字加拼音?4个批量注音方法,简单又省时
在实际工作中,给文字加拼音主要有这些场景:老师制作教材时需要给生字标拼音,学生写作文时要检查易错字的读音,出版机构排版儿童绘本要给所有汉字加注音,还有翻译文档时需要标注外文对应的中文拼音。如果手动一个个敲拼…...
机器人进厂打工首秀并不惊艳,机械臂干的活罢了,纯粹多此一举!
某家机器人企业的机器人进厂打工了,还视频直播了8小时,他们大力度赞誉机器人干活精准,然而查看了这场直播,发现这与人工智能并无太大关系,倒是更类似于普通工业机器人--机械臂就能干的活,非要弄个机器人来干…...
如何快速使用Devices.css创建精美的设备展示:面向初学者的完整指南
如何快速使用Devices.css创建精美的设备展示:面向初学者的完整指南 【免费下载链接】devices.css Pure CSS phones and tablets 项目地址: https://gitcode.com/gh_mirrors/de/devices.css Devices.css是一个基于纯CSS实现的开源项目,它提供了多种…...
保姆级教程:用SwitchyOmega+GFWList规则,5分钟搞定Chrome/Firefox代理自动切换
浏览器智能代理管理工具SwitchyOmega的配置与优化指南 在当今互联网环境下,许多用户面临着不同网络资源访问需求的变化。作为一款功能强大的浏览器代理管理扩展,SwitchyOmega能够帮助用户实现智能化的网络访问策略。本文将详细介绍如何从零开始配置这款工…...
短信验证码接口被刷如何防范?
短信验证码接口被刷如何防范? 在数字化时代,短信验证码已成为身份验证的重要手段,广泛应用于注册、登录、支付等场景。随着黑灰产技术的升级,短信验证码接口被恶意刷取的现象日益猖獗,不仅导致企业成本激增࿰…...
ComfyUI环境崩溃?一键修复,So Easy!小白无压力,保姆级操作来了!
一、环境自动备份功能详解 1.环境备份问题 常见问题:在ComfyUI中安装插件或依赖时,最头疼的问题可能是不仅没把想要装的插件安装好,还把环境搞坏了,导致整个包都启动不了。 恢复困难:如果没有代码基础,或…...
FutureRestore-GUI 2025版:图形化iOS降级终极解决方案
FutureRestore-GUI 2025版:图形化iOS降级终极解决方案 【免费下载链接】FutureRestore-GUI A modern GUI for FutureRestore, with added features to make the process easier. 项目地址: https://gitcode.com/gh_mirrors/fu/FutureRestore-GUI FutureResto…...
STM32F103驱动维特智能JY61P六轴传感器:从USB-TTL调试到按键唤醒的完整避坑指南
STM32F103驱动维特智能JY61P六轴传感器:从硬件调试到数据解析的全流程实战 在嵌入式开发领域,姿态传感器正逐渐成为各类智能设备的标配组件。维特智能JY61P作为一款性价比较高的六轴姿态传感器,集成了三轴加速度计和三轴陀螺仪,能…...
Ubuntu 18.04 ROS安装遇坑记:手把手教你修复‘EXPKEYSIG’签名无效错误
Ubuntu 18.04 ROS安装遇坑记:手把手教你修复‘EXPKEYSIG’签名无效错误 第一次在Ubuntu上安装ROS时,那种兴奋感很快被终端里鲜红的错误提示浇灭——EXPKEYSIG F42ED6FBAB17C654。作为机器人开发的基础环境,ROS的安装本应是入门第一步…...
Qwen2-VL-2B-Instruct应用场景:媒体库智能打标与跨模态内容归档系统
Qwen2-VL-2B-Instruct应用场景:媒体库智能打标与跨模态内容归档系统 1. 项目背景与价值 现代企业和个人创作者都面临着一个共同的难题:随着图片、视频、文档等多媒体内容的爆炸式增长,如何高效地管理和检索这些资源?传统的文件名…...
