一、背景介绍
在一些复制的查询中,会有很多条件拼接,不同情况要用不同的条件,关系非常复杂,这在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>