一、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()!=&quot;&quot;">
                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()!=&quot;&quot;">
                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()!=&quot;&quot;">
                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()!=&quot;&quot;">
                email = #{email} or
            </if>
            <if test="gender==0 or gender==1">
                gender = #{gender}
            </if>
        </trim>

    </select>

  那么就要在 suffixOverrides="and|or" 再添加一个 or,即去掉多个内容。

 

posted on 2021-09-07 17:21  格物致知_Tony  阅读(1888)  评论(0编辑  收藏  举报

目录导航