MyBatis Dynamic SQL

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 元素可以被用於動態包含需要更新的列,而捨去其他的。比如:

update t_role role_name = #{roleName}, note = #{note} where role_no = #{roleNo}

這裡,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 對於動態程式碼來說是可用的,這樣就可以根據不同的資料庫廠商構建特定的語句。比如下面的例子:

select seq_users。nextval from dual select nextval for seq_users from sysibm。sysdummy1“ insert into users values (#{id}, #{name})