where,set,trim
阿新 • • 發佈:2020-08-01
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 個:
- 在 id 和 username 都為空的情況下,where 標籤不會產生任何 SQL 程式碼段,最後的 SQL 語句為:
SELECT * FROM imooc_user
; - 在 id 不為空,username 為空的情況下,或者在 id 不為空,username 也不為空的情況下,where 標籤會自動給 SQL 程式碼段新增上 WHERE 字首;
- 在 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 關鍵字,且標籤內若有多餘的,
字尾也會被丟棄。