MyBatis(二)

MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其他類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句有多麼痛苦。拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最後的逗號。利用動態 SQL 這一特性可以徹底擺脫這種痛苦。
動態 SQL 元素和使用 JSTL 或其他類似基於 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多的元素需要來了解。MyBatis 3 大大提升了它們,現在用不到原先一半的元素就可以了。MyBatis 採用功能強大的基於* OGNL* 的表達式來消除其他元素。

if

動態 SQL 通常要做的事情是有條件地包含 where 子句的一部分。比如:
這裏寫圖片描述

choose, when, otherwise

有些時候,我們不想用到所有的條件語句,而只想從中擇其一二。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。
這裏寫圖片描述

trim, where, set

前面幾個例子已經合宜地解決了一個臭名昭著的動態 SQL 問題。現在考慮回到“if”示例,這次我們將“ACTIVE = 1”,在第一個條件成立時可正常查詢,若是第二條或非第一條成立的情況條件語句中就會多一個AND,若沒有條件成立查詢語句中where則會多餘,這兩種情況都會導致查詢失敗。
這個問題不能簡單的用條件句式來解決,拼接上去了時導致語句拼接複雜冗餘如果你也曾經被迫這樣寫過,那麼你很可能從此以後都不想再這樣去寫了。
where 元素知道只有在一個以上的if條件有值的情況下才去插入“WHERE”子句。而且,若最後的內容是“AND”或“OR”開頭的,where 元素也知道如何將他們去除。

如果 where 元素沒有按正常套路出牌,我們還是可以通過自定義 trim 元素來定製我們想要的功能。比如,和 where 元素等價的自定義 trim 元素爲:
這裏寫圖片描述
prefixOverrides 屬性會忽略通過管道分隔的文本序列(注意此例中的空格也是必要的)。它帶來的結果就是所有在 prefixOverrides 屬性中指定的內容將被移除,並且插入 prefix 屬性中指定的內容。

類似的用於動態更新語句的解決方案叫做 set。set 元素可以被用於動態包含需要更新的列,而捨去其他的。比如:
這裏寫圖片描述
這裏,set 元素會動態前置 SET 關鍵字,同時也會消除無關的逗號,因爲用了條件語句之後很可能就會在生成的賦值語句的後面留下這些逗號。

若你對等價的自定義 trim 元素的樣子感興趣,那這就應該是它的真面目:
這裏寫圖片描述
注意這裏我們忽略的是後綴中的值,而又一次附加了前綴中的值。

foreach

動態 SQL 的另外一個常用的必要操作是需要對一個集合進行遍歷,通常是在構建 IN 條件語句的時候。比如:
這裏寫圖片描述
foreach 元素的功能是非常強大的,它允許你指定一個集合,聲明可以用在元素體內的集合項和索引變量。它也允許你指定開閉匹配的字符串以及在迭代中間放置分隔符。這個元素是很智能的,因此它不會偶然地附加多餘的分隔符

注意 你可以將任何可迭代對象(如列表、集合等)和任何的字典或者數組對象傳遞給foreach作爲集合參數。當使用可迭代對象或者數組時,index當前迭代的次數item值是本次迭代獲取的元素。當使用字典(或者Map.Entry對象的集合)時,indexitem

bind

bind 元素可以從 OGNL 表達式中創建一個變量並將其綁定到上下文。比如:
這裏寫圖片描述

發佈了35 篇原創文章 · 獲贊 12 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章