「MyBatis」官方文檔閱讀筆記(四)

MyBatis動態SQL

前言

demo的項目地址:https://gitee.com/shuashua-world/shuashua-blog/tree/master/demo/mybatis-simple-demo

MyBatis動態SQL的元素種類:兩個條件判斷、一個控制前綴後綴值、一個用於遍歷。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if 標籤

if標籤用於條件判斷。使用動態 SQL 最常見情景是根據條件包含 where 子句的一部分。比如:

只使用if標籤的一個潛在問題就是下面這種情況:

choose (when, otherwise)標籤

與if標籤類似,都用於條件判斷。有時候,我們不想使用所有的條件,而只是想從多個條件中選擇一個使用。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。

trim (where, set) 標籤

where和set標籤都可以認為是trim標籤的一個子集,他們能提供的功能,trim都能提供。

where標籤

where 元素只會在子元素返回任何內容的情況下才插入 “WHERE” 子句。而且,若子句的開頭為 “AND” 或 “OR”,where 元素也會將它們去除。

where 元素等價的自定義 trim 元素為:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>

where標籤的使用demo:

set標籤

set 元素可以用於動態包含需要更新的列,忽略其它不更新的列。。set 元素會動態地在行首插入 SET 關鍵字,並會刪掉額外的逗號(這些逗號是在使用條件語句給列賦值時引入的)。

和 set元素等價的自定義 trim 元素為:

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

set標籤的使用demo:

trim標籤

trim標籤可以用於前後綴的處理上。

一個完整的trim標籤:<trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>

trim標籤的四個屬性:

  • prefix:在子元素返回任何內容的情況下插入前綴。
  • suffix:在子元素返回任何內容的情況下插入後綴。
  • prefixOverrides:移除所有 prefixOverrides 屬性中指定的內容。prefixOverrides 屬性會忽略通過管道符分隔的文本序列,即可以通過管道符|分隔多個內容。
  • suffixOverrides: 與prefixOverrides類似。

foreach

常見使用場景是對集合進行遍歷(尤其是在構建 IN 條件語句的時候)。

foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結尾的字符串以及集合項迭代之間的分隔符。這個元素也不會錯誤地添加多餘的分隔符。

它可以將任何可迭代對象(如 List、Set 等)、Map 對象或者數組對象作為集合參數傳遞給 foreach。當使用可迭代對象或者數組時,index 是當前迭代的序號,item 的值是本次迭代獲取到的元素。當使用 Map 對象(或者 Map.Entry 對象的集合)時,index 是鍵,item 是值。