1. 程式人生 > 實用技巧 >where,set,trim

where,set,trim

where、set、trim 三個標籤都是為了解決 MyBatis 在動態生成 SQL 時,產生了多餘的字首和字尾的問題。

where例項

<select id="selectUserByIdAndName" resultType="com.imooc.mybatis.model.User">
  SELECT * FROM imooc_user
  <where>
    <if test="id != null">
      id = #{id}
    </if>
    <if test="username != null">
      AND username = #{username}
    </if>
  </where>
</select>

在這個例子中,id 和 username 均非固定的過濾引數,只有當其不為 null 時才會加入到 SQL 語句中。此處 where 標籤的作用大概有如下 3 個:

  1. 在 id 和 username 都為空的情況下,where 標籤不會產生任何 SQL 程式碼段,最後的 SQL 語句為:SELECT * FROM imooc_user
  2. 在 id 不為空,username 為空的情況下,或者在 id 不為空,username 也不為空的情況下,where 標籤會自動給 SQL 程式碼段新增上 WHERE 字首;
  3. 在 id 為空,username 不為空的情況下,where 標籤會自定去除 AND 字首,此時生成的 SQL 語句為: SELECT * FROM imooc_user WHERE username = ?

set例項

<update id="updateUsernameAndScoreById">
  UPDATE imooc_user
  <set>
    <if test="username != null">
      username = #{username},
    </if>
    id = #{id}
  </set>
  WHERE id = #{id}
</update>

set 標籤會自動在 SQL 語句中新增上相應的 SET 字首,並根據裡面的條件動態地新增相應的欄位。

由於 SQL update 的語法問題,若 set 標籤裡面條件均不滿足,此時 set 標籤也不會新增上 SET 字首,但此時 SQL 會報語法錯誤,所以 set 標籤中還是得有一個必然存在的賦值。

trim例項

<update id="updateUsernameAndScoreById">
  UPDATE imooc_user
  <trim prefix="SET" suffixOverrides=",">
    <if test="username != null">
      username = #{username},
    </if>
    <if test="id != null">
      id = #{id}
    </if>
  </trim>
  WHERE id = #{id}
</update>

這裡的 trim 例項實現了與 set 例項同樣的功能,set 標籤是 trim 標籤的一種特殊情況。

trim 標籤共有 4 個屬性,它們的作用分別如下:

  • prefix: 字首屬性,若標籤內不為空則在 SQL 中新增上字首;
  • prefixOverrides: 字首覆蓋屬性,若標籤中有多餘的字首,將會被覆蓋(其實就是丟棄該字首);
  • suffix: 字尾屬性,若標籤內不為空則在 SQL 中新增上字尾;
  • suffixOverrides: 字尾覆蓋屬性,若標籤中有多餘的字尾,將會被覆蓋(其實就是丟棄該字尾)。

這個例子中,trim 標籤的字首為SET,字尾覆蓋屬性為,,所以在標籤內不為空的情況下給 SQL 語句添加了 SET 關鍵字,且標籤內若有多餘的,字尾也會被丟棄。