在使用mybatis的动态sql语句时,有时候遇到根据条件判断添加where后面的筛选条件,会出现多余的“and”或者“or”,如下:
<select id="findName" resultType="Name">
SELECT * FROM user
WHERE
<if test="tel != null">
tel = #{tel}
</if>
<if test="title != null">
AND title like #{title}
</if>
</select>
如果第一个参数“tel”为空,那么sql会变成下面这样,
select * from user where and title like
如果两个if都为空,那么输出为,
select * from user where
显然这样的sql执行时,会发生错误。使用where标签就可以解决这个问题,
<select id="findName"resultType="Name">
SELECT * FROM user
<where>
<if test="tel != null">
tel = #{tel}
</if>
<if test="title != null">
AND title like #{title}
</if>
</where>
</select>
where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。
功能类似的标签有trim标签,例如:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
prefix:前缀,
prefixoverride:去掉第一个“and”或者是“or”
“trim”标签还有其他属性,
suffixoverride:去掉最后标记的字符(就像是上面的and一样)
suffix:后缀