美文网首页
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