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

Mybatis 动态 SQL - trim, where, set

之前的例子都巧妙地避开了一个臭名昭著的动态SQL挑战。考虑一下如果我们回到之前的“if”例子,但这次我们将“ACTIVE = 1”也作为一个动态条件。

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOGWHERE<if test="state != null">state = #{state}</if><if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if>
</select>

如果没有满足任何条件,会发生什么?你最终会得到类似于下面的SQL语句:

SELECT * FROM BLOG
WHERE

如果只有第二个条件满足,最终的SQL语句将如下所示:

SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’

这也会失败。这个问题不容易通过条件语句解决,如果你曾经不得不写过它,那么你很可能再也不想这样做了。

MyBatis 在大多数情况下有一个简单的答案,可能在 90% 的情况下都能起作用。而在它无法满足要求的情况下,你可以自定义它来达到目的。只需要一个简单的改变,一切都会正常工作:

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG<where><if test="state != null">state = #{state}</if><if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if></where>
</select>

如果 ​<where>​元素中的嵌套标签返回任何内容,它会知道只在查询条件非空时插入 "WHERE" 关键字。此外,如果条件的内容以 "AND" 或 "OR" 开头,它会自动去掉这些关键字。

如果`<where>`元素的行为不符合您的要求,您可以通过定义自己的`<trim>`元素来进行自定义。例如,与`<where>`元素相对应的`<trim>`元素可以是:

<trim prefix="WHERE" prefixOverrides="AND |OR ">...
</trim>

​<trim>​元素的 ​prefixOverrides​属性接受一个使用管道符分隔的文本列表,其中空格是有关的。结果是删除 ​prefixOverrides​属性中指定的内容,并插入 ​prefix​属性中指定的内容。

对于动态更新语句,也有一个类似的解决方案,称为`<set>`元素。`<set>`元素可以用于动态包含要更新的列,以及排除其他列。例如:

<update id="updateAuthorIfNecessary">update Author<set><if test="username != null">username=#{username},</if><if test="password != null">password=#{password},</if><if test="email != null">email=#{email},</if><if test="bio != null">bio=#{bio}</if></set>where id=#{id}
</update>

在这个例子中,​<set>​元素将动态添加 "SET" 关键字,并且在应用条件后消除任何多余的逗号。

另外,您也可以通过使用`<trim>`元素来实现相同的效果:

<trim prefix="SET" suffixOverrides=",">...
</trim>

请注意,在这种情况下,我们覆盖的是后缀,而仍然附加前缀。

http://www.lryc.cn/news/269516.html

相关文章:

  • 大模型系列:OpenAI使用技巧_使用OpenAI进行K-means聚类
  • 共享单车之数据分析
  • Spring的Bean你了解吗
  • MongoDB聚合:$merge 阶段(1)
  • 2. 云原生实战之kubesphere搭建
  • main参数传递、反汇编、汇编混合编程
  • 前后端分离nodejs+vue医院预约挂号系统6nrhh
  • 在pytorch中,读取GPU上张量的数值 (数据从GPU到CPU) 的几种常用方法
  • 【mysql】—— 表的内连和外连
  • VSCode远程开发配置
  • 复数值神经网络可能是深度学习的未来
  • 【C语言】数据结构——排序二(快排)
  • 企业私有云容器化架构
  • SpringBoot+modbus4j实现ModebusTCP通讯读取数据
  • Linux性能优化全景指南
  • 树莓派 ubuntu20.04下 python调讯飞的语音API,语音识别和语音合成
  • 分布式系统架构设计之分布式系统实践案例和未来展望
  • 【办公软件】Excel双坐标轴图表
  • 彻底理解前端安全面试题(1)—— XSS 攻击,3种XSS攻击详解,建议收藏(含源码)
  • UE5.1_AI随机漫游
  • 智慧城市新型基础设施建设综合方案:文件全文52页,附下载
  • GitHub Copilot 终极详细介绍
  • LeetCode第63题 - 不同路径 II
  • python+django网上银行业务综合管理系统vue_bvj8b
  • 【软件工程】走进瀑布模型:传统软件开发的经典之路
  • 两个字符串间的最短路径问题 (100%用例)C卷 (JavaPythonNode.jsC语言C++)
  • 通过ADB来实现脚本来控制手机
  • 机器学习之K-means聚类
  • SSH 端口转发:如何将服务绑定到本地 IP 地址
  • 回归预测 | MATLAB实ZOA-LSTM基于斑马优化算法优化长短期记忆神经网络的多输入单输出数据回归预测模型 (多指标,多图)