MyBatis 的強大特性之一便是它的動态 SQL。如果你有使用 JDBC 或其他類似架構的經驗,你就能體會到根據不同條件拼接 SQL 語句有多麼痛苦。拼接的時候要確定不能忘了必要的空格,還要注意省掉列名清單最後的逗号。利用動态 SQL 這一特性可以徹底擺脫這種痛苦。
通常使用動态 SQL 不可能是獨立的一部分,MyBatis 當然使用一種強大的動态 SQL 語言來改進這種情形,這種語言可以被用在任意的 SQL 映射語句中。
動态 SQL 元素和使用 JSTL 或其他類似基于 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多的元素需要來了解。MyBatis 3 大大提升了它們,現在用不到原先一半的元素就可以了。MyBatis 采用功能強大的基于 OGNL 的表達式來消除其他元素。
常用的幾種動态sql的标簽:if、choose(when/otherwise)、where、set、trim、foreach
下面分别介紹這幾種标簽
1. 判斷語句
If标簽是條件判斷,接受一個boolean類型,一個屬性test,定義為:
test CDATA #REQUIRED
>
注意的是多個判斷用and 或者or連接配接
例如:
select * from person and persion.firstName = #{firstName} and id = #{id}
第一個條件,如果firstName不為空,作為where的條件,連接配接符用and,第二個條件是單個條件,看起來寫法與java并沒有什麼大的不同,沒有增加開發者的學習成本。
If用作單個添加的判斷,如果多多條件分支,這時if就比較麻煩了,這時choose就發揮使用者
2. 分支判斷
這三個标簽通常都會一同出現, 有時候可以沒有
不接受任何參數,接受一個test的條件屬性,舉個例子:
select * from person and id > 100 and id >= 80 and id < 100 and id >= 60 and id < 80 and id < 60
三個分支,按照條件查詢不同的資料範圍的資料, 注意的是 > < 的寫法,在mybatis裡面,不能直接用,隻能用> 表示>,< 表示= 那麼>=,<=表示也是一樣的。
3. where條件标簽
向上述兩個例子中,都用到了标簽,通常where标簽和if,whoose配合使用,如果在添加的前面加上where 語句,如果條件沒有,則不加where,如果沒有這樣的标簽,那麼隻能在前面加上1=1,這樣很難看
4. 标簽,先舉個例子來說明
依然是上面的裡面,那麼我們不同where的話,怎麼做了,也可以用trim
select * from person and id > 100 and id >= 80 and id < 100 and id >= 60 and id < 80 and id < 60
我們在條件的前面加上一個where語句,如果前面是and,那麼去填,可以在前後加,
5. 标簽
通常在更新語句中用到
update "awful table" "first name" = #{firstFirstName,jdbcType=VARCHAR}, FIRST_NAME = #{secondFirstName,jdbcType=VARCHAR}, where "CuStOmEr iD" = #{customerId,jdbcType=INTEGER}
Set配合if或者choose一起使用, 特别要注意,如果全都是空,會報sql錯誤,如果有如下SQL:
update ytx_consult
and login_id = #{loginId}
and nick_name = #{nickName}
where id = 1
而兩個條件都為空,那麼執行的sql就是:update ytx_consult where id = 1
是以在此要保證至少有一項不為空,比如加上update_time = now()
6. 多值循環标簽
如果傳入的是多個值的資料或清單,那麼需要循環,看一個完整的例子:
SELECT * FROM POST P id = #{id} AND author_id = #{author_id} AND id IN #{ids[${index}]}
這個例子中用到多種動态的sql,在此主要看foreach,傳遞過來的是一個數組,那麼在in中,循環擷取這個數組作為參數, 我們來看看foreach的定義:
上述示例中,選擇ids, 每項表示為item_id,元素的前後加上括号,以逗号分隔。