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

Mybatis中的两个动态SQL标签

目录

功能对比

代码示例

实际效果

如何选择

总结


在Mybatis中,

<trim> and <set>

都是动态SQL标签,用于处理更新操作中的条件拼接。以下是它们的区别和适用场景:

功能对比

特性<trim>实现<set>实现
标签用途通用标签,可自定义前缀、后缀和覆盖规则。专为 UPDATE 设计的简化标签,自动处理 SET 和逗号。
前缀需手动指定 prefix="set"。自动添加 SET 关键字。
后缀处理需手动指定 suffixOverrides="," 去除多余逗号。自动去除最后一个逗号。
灵活性更高,可用于其他场景(如 WHERE 条件拼接)。仅适用于 UPDATE 的 SET 部分。

代码示例

<update id="trimUpdate" parameterType="com.qcby.entity.User">update user<trim prefix="set" suffixOverrides=","><if test="username != null and username != ''">username = #{username},</if><if test="birthday != null">birthday = #{birthday},</if><if test="address != null and address != ''">address = #{address},</if><if test="password != null and password != ''">password = #{password},</if></trim>where id = #{id}
</update>
  • 手动配置:
    • prefix = "set":在条件前加“set”关键字
    • suffixOverrides = “,”:自动去除末尾多余的逗号
<update id="update" parameterType="com.qcby.entity.User">update user<set><if test="username != null and username != ''">username = #{username},</if><if test="birthday != null">birthday = #{birthday},</if><if test="address != null and address != ''">address = #{address},</if><if test="password != null and password != ''">password = #{password},</if></set>where id = #{id}
</update>
  • 自动处理:
    • 自动添加“set”关键字
    • 自动去除最后一个逗号

实际效果

假设 User 对象只有 username 和 password 非空,生成的SQL如下:

/*trimUpdate:*/
update user 
SET username = '张三', password = '123456' 
where id = 1;/*update:*/
update user 
SET username = '张三', password = '123456' 
where id = 1;

两者生成的SQL完全一致,但 “set” 的实现更简洁

如何选择

  • 使用set:
    • 专为 update 设计,代码更简洁,推荐在大多数更新场景中使用
  • 使用trim:
    • 需要更灵活的拼接(如动态 where 或混合逻辑时),或需要自定义前缀后缀时使用

总结

场景推荐标签原因
标准 UPDATE 操作set语法简洁,自动处理 SET 和逗号。
复杂动态 SQLtrim灵活控制前缀、后缀和覆盖规则(如同时处理 SET 和 WHERE 条件拼接)。

根据实际需求选择即可,功能上两者在 update 中等价,但 set 可读性更优

http://www.xdnf.cn/news/9234.html

相关文章:

  • (先发再改)测试流程标准文档
  • 【面试题】如何测试即时通信功能:A给B发送一条了信息:hello
  • ‌加密 vs 电子签名:公钥私钥的奇妙冒险
  • 大数据学习(121)-sql重点问题
  • IP2366调试问题总结
  • 第12次07 :邮箱的验证
  • 57、【OS】【Nuttx】编码规范解读(五)
  • ET CircularBuffer 类
  • Cadence学习笔记之---PCB过孔替换、封装更新,DRC检查和状态查看
  • 动态贴纸的实时渲染原理:美颜SDK中的特效引擎开发实录
  • 化工厂电动机保护升级记:当Profinet遇上DeviceNet
  • 【数字图像处理】_笔记
  • Webpack 5 模块联邦(Module Federation)详解与实战
  • 多头注意力 vs 单头注意力:计算量与参数量区别
  • MySQL日志文件有哪些?
  • 一、docker安装以及配置加速
  • [免费]SpringBoot+Vue在线教育(在线学习)系统(高级版)【论文+源码+SQL脚本】
  • Python打卡训练营Day37
  • 《仿盒马》app开发技术分享-- 新增地址(端云一体)
  • AI算力网络光模块市场发展分析
  • 第二章 1.1 数据采集安全风险概述
  • 程序编码规范,软件设计规范
  • 【产品经理】产品经理知识体系
  • Mysql性能优化方案
  • 洛谷题目:P2785 物理1(phsic1)- 磁通量 题解 (本题较难)
  • Arduino+LCD1602,并口版 LCD1602和IIC版LCD1602
  • w~自动驾驶~合集2~激光毫米波雷达
  • 深入解构 Chromium 升级流程与常见问题解决方案
  • 从实验室到工业的“加速器”:单原子催化技术的突破与应用
  • 兰亭妙微 | 图标设计公司 | UI设计案例复盘