一、trim 标签
语法:
<trim prefix="" suffix="" prefixOverrides="" suffixOverrides="">:截取并拼接
属性说明:
trim 标签用于截取并拼接,即可以在条件判断完的 SQL 语句前后,添加或者去掉指定的字符。
prefix:(添加前缀)trim标签体中是整个字符串拼串后的结果,是给拼串后的整个字符串加一个前缀
suffix:(添加后缀)suffix给拼串后的整个字符串加一个后缀
prefixOverrides:前缀覆盖: 去掉整个字符串前面多余的字符(去掉前缀)
suffixOverrides:后缀覆盖:去掉整个字符串后面多余的字符(去掉后缀)
trim 用于自定义字符串的截取规则,后面多出的 and 或者 or 使用 where 标签不能解决。
二、trim 标签的使用
1、在接口中声明方法
public List<Employee> getEmpsByConditionTrim(Employee employee);
2、在对应的 xml 中配置
<!--
public List<Employee> getEmpsByConditionTrim(Employee employee);
-->
<!--
trim:自定义字符串的截取规则
后面多出的and或者or where 标签不能解决
prefix="":前缀,trim标签体中是整个字符串拼串后的结果。
prefix 给拼串后的整个字符串加一个前缀
prefixOverrides=""
前缀覆盖:去掉整个字符串前面多余的字符
suffix="":后缀
suffix给拼接后的整个字符串加一个后缀
suffixOverrides=""
后缀覆盖:去掉整个字符串后面多余的字符
-->
<select id="getEmpsByConditionTrim" resultType="Employee">
select * from tbl_employee
<trim prefix="where" prefixOverrides="" suffix="" suffixOverrides="and">
<if test="id!=null">
id=#{id} and
</if>
<if test="lastName!=null and lastName!=''">
last_name like #{lastName} and
</if>
<if test="email!=null and email.trim()!=""">
email = #{email} and
</if>
<if test="gender==0 or gender==1">
gender = #{gender}
</if>
</trim>
</select>
三、细节
对于上一节的多条件的查询,可以使用 if 和 where 标签进行查询。
这时把 and 关键字放在了条件的后面,又会出现什么问题呢?
执行的 SQL 语句:
<select id="getEmpsByConditionTrim" resultType="Employee">
select * from tbl_employee
<where>
<if test="id!=null">
id=#{id} and
</if>
<if test="lastName!=null and lastName!=''">
last_name like #{lastName} and
</if>
<if test="email!=null and email.trim()!=""">
email = #{email} and
</if>
<if test="gender==0 or gender==1">
gender = #{gender}
</if>
<where>
</select>
这时把 and 关键字放在了条件的后面,如果缺少最后一个条件,又会出现什么问题呢?
执行的 SQL 语句:
select * from tbl_employee where id=? and email=? and
可以发现,如果最后一个查询条件不进行拼接,在后面就会多出一个 and 关键字,从而执行失败!!!
使用 trim 标签解决问题:
<select id="getEmpsByConditionTrim" resultType="Employee">
select * from tbl_employee
<trim prefix="where" prefixOverrides="" suffix="" suffixOverrides="and">
<if test="id!=null">
id=#{id} and
</if>
<if test="lastName!=null and lastName!=''">
last_name like #{lastName} and
</if>
<if test="email!=null and email.trim()!=""">
email = #{email} and
</if>
<if test="gender==0 or gender==1">
gender = #{gender}
</if>
</trim>
</select>
在 <if> 标签中进行拼接的 SQL 语句前面,需要加上 where 关键字,可以使用 trim 中的 prefix 属性来进行添加,而对于 拼接最后一个条件不成立时,后面的 and 也会去掉
执行的 SQL 语句:
select * from tbl_employee where id=? and email=?
如果其中使用 or 进行拼接呢?
<select id="getEmpsByConditionTrim" resultType="Employee">
select * from tbl_employee
<trim prefix="where" prefixOverrides="" suffix="" suffixOverrides="and">
<if test="id!=null">
id=#{id} and
</if>
<if test="lastName!=null and lastName!=''">
last_name like #{lastName} and
</if>
<if test="email!=null and email.trim()!=""">
email = #{email} or
</if>
<if test="gender==0 or gender==1">
gender = #{gender}
</if>
</trim>
</select>
那么就要在 suffixOverrides="and|or" 再添加一个 or,即去掉多个内容。