mybatis复杂条件查询<trim>标签

一、背景介绍

在一些复制的查询中,会有很多条件拼接,不同情况要用不同的条件,关系非常复杂,这在B端程序中经常出现。

二、场景举例

在这里插入图片描述这一块判断都是根据当前人角色来决定是否添加的,利用 <trim><if> 标签则可以非常方便控制,代码如下:
在这里插入图片描述

三、用法解释

如果不用<trim>标签则需要写很多IF判断是否要OR开头,非常麻烦。
<trim>标签其基本格式如下:
prefix:表示在trim包裹的SQL语句前面添加的指定内容。
suffix:表示在trim包裹的SQL末尾添加指定内容。
prefixOverrides:表示去掉(覆盖)trim包裹的SQL的指定首部内容。
suffixOverrides:表示去掉(覆盖)trim包裹的SQL的指定尾部内容。

<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""

</trim>

重点!!!<trim>中为空,例如里面的所有if都不满足,trim会无效,sql上面不会出现trim标签的内容

四、用法举例

1、prefix 使用示例

<select id="getUser" resultType="user">
 select * from user_tab 
 <trim prefix="where">
  last_name=#{lastName} and age=#{age} and phone=#{phone}
 </trim>
</select>

在动态生成sql的过程中,会将prefix前缀 拼接到 trim标签的外侧,最终得到的sql如下:

select * from user_tab where last_name=#{lastName} and age=#{age} and phone=#{phone}

2、prefixOverrides 使用

有动态查询语句如下:

<select id="getUser" resultType="user">
 select * from user_tab 
 <trim prefix="where">
  <if test="lastName != null">
   last_name=#{lastName}
  </if>
  <if test="age != null">
   and age=#{age}
  </if>
  <if test="phone != null">
   and phone=#{phone}
  </if>
 </trim>
</select>

在动态sql的查询过程中,如果 lastName为null,所以第一个if不成立,里面的SQL语句不拼接,第二个if里面的and边紧跟在where后面了,语法错误。最终动态生成的sql如下:

 select * from user_tab where and age = ? and phone = ?

为了解决这个问题,只要加上prefixOverride即可,表示把动态生成的sql中,trim标签内的首个“and”去掉。

<select id="getUser" resultType="user">
 select * from user_tab 
 <trim prefix="where" prefixOverrides="and">
  <if test="lastName != null">
   and last_name=#{lastName}
  </if>
  <if test="age != null">
   and age=#{age}
  </if>
  <if test="phone != null">
   and phone=#{phone}
  </if>
 </trim>
</select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值