MyBatis 的強大特性之一便是它的
動態 SQL
。如果你有使用 JDBC 或其他類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句有多麼痛苦。拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最後的逗號。利用動態 SQL 這一特性可以徹底擺脫這種痛苦。
if
動態 SQL 通常要做的事情是有條件地包含 where 子句的一部分。比如:
choose, when, otherwise
有些時候,我們不想用到所有的條件語句,而只想從中擇其一二。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。
trim, where, set
在第一個例子中,假如不加上1=1的話,比如當第一個條件不成立的時候,SQL就變成了這樣:
SELECT * FROM t_role WHERE AND roleName like concat(‘%’,#{roleName},‘%’)
為了防止這種情況,我們可以使用where元素:
where 元素知道只有在一個以上的if條件有值的情況下才去插入“WHERE”子句。而且,若最後的內容是“AND”或“OR”開頭的,where 元素也知道如何將他們去除。
和 where 元素等價的自定義 trim 元素為:
perfix表示語句字首,prefixOverrides表示要去除的字首(注意此例中的空格也是必要的)。它帶來的結果就是所有在 prefixOverrides 屬性中指定的內容將被移除,並且插入 prefix 屬性中指定的內容。
類似的用於動態更新語句的解決方案叫做 set。set 元素可以被用於動態包含需要更新的列,而捨去其他的。比如:
這裡,set 元素會動態前置 SET 關鍵字,同時也會消除無關的逗號。
對應的trim元素的寫法為:
suffixOverrides去除字尾。
forEach
動態 SQL 的另外一個常用的必要操作是需要對一個集合進行遍歷,通常是在構建 IN 條件語句的時候。比如:
說明:
collection配置的sexList是傳遞進來的引數名稱,可以為陣列,List,Set或集合。
item配置的是迴圈中當前的元素。
index配置的是當前元素的下標。
open和close配置的是以什麼符號將這些集合元素包裹起來。
separator配置的是間隔符。
bind
bind元素可以從 OGNL 表示式中建立一個變數並將其繫結到上下文。比如:
其中
_paramrter
代表的是傳進來的引數,和萬用字元連線後賦給了pattern。
script
要在帶註解的對映器介面類中使用動態 SQL,可以使用
script
元素。比如:
@Update({“”}) void updateAuthorValues(Author author);
Multi-db vendor support
一個配置了“_databaseId”變數的 databaseIdProvider 對於動態程式碼來說是可用的,這樣就可以根據不同的資料庫廠商構建特定的語句。比如下面的例子: