mybatis 的 trim 标签 用法

Mybatis 的 mapper.xml文件 中 sql语句之 trim标签用法

一、prefix和prefixOverrides用法的基本步骤

如果prefixOverrides有元素,拿元素去匹配 第一个子标签sql语句(满足if条件匹配成功的sql片段),若匹配上,就删掉sql语句的匹配部分,如果 prefix 有值 那么就会在第一个通过if判断的语句前边加上 prefix的值

<select id="selectUsersTrim" resultMap="resultListUsers" parameterType="Users">
      select * from users      
	 <trim prefix="where" prefixOverrides="and ">               
           <if test="name!=null">               
               name=#{name}          
           if>          
           <if test="address!=null">               
               and address=#{address}          
           if>               
      trim>      
select>

比如上述代码块,有以下几种情况

  1. 假设,第一个if语句和第二个if语句全部通过,那么最终的sql语句就是:select * from users where name = ? and address = ?
    这个sql是标准的写,prefixOverrides=“and” 去检测第一个if标签里的sql片段 如果有and 就覆盖掉,这里明显没有 prefix=“where” 就会在 第一个if的前边加上 where

  2. 假设,只有第一个if语句通过,那么最终的sql语句就是:select * from users where name = ?
    这个sql中prefixOverrodes=“and” 它也是去检测第一个if标签里 有没有and 这里明显也没有 ,prefix=“where” 会在该语句前边加上where

  3. 假设,只有第二个if语句通过,那么最终sql语句为:select * from users where address = ?
    可以看到and不见了 这时 prefixOverrides=“and” 会去匹配这个代码片段 发现有 and 那么就会把代码片段中的 and 覆盖掉(注意是 and_ 这里还有个空格)

-----------------------------------------——————————————--------------------------------------------
二、suffix和suffixOverrides用法的基本步骤

如果suffixOverrides有元素,拿元素去匹配 最后一个子标签sql语句(满足if条件匹配成功的sql片段),若匹配上,就删掉sql语句的匹配部分,如果 prefix 有值 那么就会在第一个通过if判断的语句后边加上 suffix的值

    <update id="updateBlog" parameterType="map">
        update db5.blog
        <trim prefix="set" suffixOverrides=",">
            <if test="title != null">
                title = #{title},
            if>
            <if test="author != null">
                author = #{author}
            if>
        trim>
        where id = #{id}
    update>

比如上述代码块,有以下几种情况

  1. 假设,第一个if语句和第二个if语句全部通过,那么最终的sql语句就是:update db5.blog set title = ?, author = ? where id = ?
    这个sql是标准的写,prefix=“set” 会在 第一个 通过if条件的sql片段前边加上 set 。

    suffixOverrides=","会去匹配,最后一个通过if判断的sql片段,如果有 “,” 那么 就覆盖掉 这里最后一个片段是 author = #{author}明显是没有, 的 所以 不会做任何操作

  2. 假设,只有第一个if语句,那么最终的sql语句就是:update db5.blog set title = ? where id = ?
    ,prefix=“set” 会在 第一个 通过if条件的sql片段前边加上 set 。

    suffixOverrides=","会去匹配,最后一个通过if判断的sql片段,如果有 “,” 那么 就覆盖掉 这里最后一个片段是 title = #{title}, 明显 是有 , 的 所以 会去 覆盖掉 suffixOverrides 的值 即–> ,

  3. 假设,只有第二个if语句,那么最终的sql语句就是:update db5.blog set author = ? where id = ?
    ,prefix=“set” 会在 第一个 通过if条件的sql片段前边加上 set 。

    suffixOverrides=","会去匹配,最后一个通过if判断的sql片段,如果有 “,” 那么 就覆盖掉 这里最后一个片段是 author = #{author} 明显 是没有 , 的 所以 不会去做操作。

总结 :

1. 要知道 这个 动态sql 代码块的 执行流程 什么时候 通过 if 什么时候 不通过
2.要深刻理解 prefix,prefixOverrides,suffix,suffixOverrides 的 功能!

你可能感兴趣的:(mybatis)