美文网首页
mybatis动态SQL - trim where set标签

mybatis动态SQL - trim where set标签

作者: hellokitty小丸子 | 来源:发表于2019-09-26 11:00 被阅读0次

    格式化输出:

    mybatis的trim标签一般用于动态SQL中,去除SQL语句中多余的and关键字,逗号,或者给SQL语句前拼接 “where“、“set“以及values, “(” 前缀,“)“ 后缀等,可用于选择性插入、更新、删除或者条件查询等操作,。
    以下是trim标签中涉及到的属性:

    trim标签属性.png

    一、trim where - 去除多余关键字and、or

    例:

    <select id="insertSelective" resultType="BaseResultMap">
      SELECT * 
      FROM wechat_qa
      WHERE 
      <if test="id != null">
        id = #{id}
      </if> 
      <if test="name != null">
        AND name like #{name}
      </if>
      <if test="age != null">
        AND age =#{age}
      </if>
    </select>
    

    如果这些条件一个都没有匹配,这条SQL会变成这样:

    SELECT * FROM wechat_qa
    WHERE
    

    这会导致查询失败。如果只第二个条件匹配呢?这条SQL会变成这样:

    SELECT * FROM wechat_qa
    WHERE 
    AND name like ‘someName’
    

    可以使用where标签来解决这个问题,where 元素只会在至少有一个子元素的条件返回SQL子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。
    例:

    <select id="insertSelective" resultType="BaseResultMap">
      SELECT * 
      FROM wechat_qa
      <WHERE >
        <if test="id != null">
          id = #{id}
        </if> 
        <if test="name != null">
          AND name like #{name}
        </if>
        <if test="age != null">
          AND age =#{age}
        </if>
      </WHERE>
    </select>
    

    用trim标签也可以完成相同的功能:

    <select id="insertSelective" resultType="BaseResultMap">
      SELECT * 
      FROM wechat_qa
      <trim  prefix="WHERE" prefixOverrides="AND" >
        <if test="id != null">
          id = #{id}
        </if> 
        <if test="name != null">
          AND name like #{name}
        </if>
        <if test="age != null">
          AND age =#{age}
        </if>
      </trim>
    </select>
    

    二、trim set - 去除多余的逗号

    类似的用于动态更新语句的解决方案叫做 set。set 元素可以被用于动态包含需要更新的列,而舍去其他的。
    例:

    <update id="updateUser">
      update wechat_qa
      set
        <if test="name != null">
            name=#{name},
        </if>
        <if test="age != null">
          age=#{age}
        </if>
      where id=#{id}
    </update>
    

    如果<if test="name != null">name=#{name},</if>没有匹配上,SQL语句就会变成如下这样,更新会失败:

    update wechat_qa set name=name, where id=id
    

    使用set标签可以解决这个问题,用于动态包含需要更新的列,而舍去其他的,set会动态前置 SET 关键字,同时也会消除无关的逗号:

    <update id="updateUser">
      update wechat_qa
        <set>
          <if test="name != null">name=#{name},</if>
          <if test="age != null">age=#{age}</if>
        </set>
      where id=#{id}
    </update>
    

    用trim标签也可以完成相同的功能:

    <trim prefix="SET" suffixOverrides=",">
      ...
    </trim>
    

    同样的,插入数据:

    <insert id="insertUser" resultType="BaseResultMap">
       insert into wechat_qa (
         <if test="id != null">
           id,
         </if>
         <if test="name != null">
           name,
         </if>
         <if test="age != null">
           age
         </if>
    ) 
    values (
         <if test="id != null">
           #{id},
         </if>
         <if test="name != null">
           #{name},
         </if>
         <if test="age != null">
           #{age}
         </if>
    )
    </insert>
    

    如果<if test="age != null">age</if>条件没有匹配上,SQL语句就会变成如下这样,插入会报错:

    INSERT INTO wechat_qa(id,name,) VALUES(id,name,)
    

    用trim标签可以解决这个问题:

    <insert id="insertUser" resultType="BaseResultMap">
       insert into wechat_qa 
       <trim prefix="(" suffix=")" suffixOverrides=",">
         <if test="id != null">
           id,
         </if>
         <if test="name != null">
           name,
         </if>
         <if test="age != null">
           age
         </if>
       </trim>
       <trim prefix="(" suffix=")" suffixOverrides=",">
         <if test="id != null">
           #{id},
         </if>
         <if test="name != null">
           #{name},
         </if>
         <if test="age != null">
           #{age}
         </if>
       </trim>
    </insert>
    

    相关文章

      网友评论

          本文标题:mybatis动态SQL - trim where set标签

          本文链接:https://www.haomeiwen.com/subject/rwkfuctx.html