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 是值。