MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數據庫中的記錄。
現在MyBatis越來越受大家的喜愛了,它的優勢大家都知道,我就不多說了,直接說重點。
MyBatis中提供動態SQL功能,我們可以使用<if><when><where><otherwise><foreach>等等,這樣我們就可以寫出根據條件生成的動態SQL了,但是,在這中間,我們經常用到的<if>標簽有一個小誤區,一不小心就會掉下去,下面先舉個正常的例子:
1
2
3
4
5
6
7
8
|
<select id= "findActiveBlogWithTitleLike" parameterType= "Blog" resultType= "Blog" > SELECT * FROM BLOG WHERE state = ‘ACTIVE' < if test= "title != null" > AND title like #{title} </ if > </select> |
在上面的例子中,當title不等于null時,<if>標簽中間的條件才會被拼接上,這樣,SQL語句就是動態的了。
但是,當我們對所有條件進行判斷時,你是否會這樣寫:
1
2
3
4
5
6
7
8
9
10
11
|
<select id= "findActiveBlogWithTitleLike" parameterType= "Blog" resultType= "Blog" > SELECT * FROM BLOG WHERE < if test= "userId != null" > state = ‘ACTIVE' </ if > < if test= "title != null" > AND title like #{title} </ if > </select> |
沒問題吧?至少語法上不錯的,至少它可以正常生成一個SQL。
但是,不知道你注意到了沒,當所有條件都為null的時候,會出現什么情況?
1
2
|
SELECT * FROM BLOG WHERE |
看到了吧?這樣的SQL能成功執行么?
答案當然是NO。
那么該怎么辦?那就要記住了,當你寫動態SQL時候,先考慮一下會不會產生所有條件都不成立的情況,會不會出現只有一個WHERE而沒有條件的情況,那么你要做的就是加一個<where>標簽將所有條件包起來。
1
2
3
4
5
6
7
8
9
10
11
12
|
<select id= "findActiveBlogWithTitleLike" parameterType= "Blog" resultType= "Blog" > SELECT * FROM BLOG <where> < if test= "userId != null" > state = ‘ACTIVE' </ if > < if test= "title != null" > AND title like #{title} </ if > </where> </select> |
這樣,當所有條件都不成立時,WHERE也不會被拼上。
這時,有機靈的小伙伴發現了,如果第一個條件不成立,第二個成立,那SQL會不會變成這樣?
1
2
3
|
SELECT * FROM BLOG WHERE AND title like #{title} |
這個就放心好了,當你用<if>標簽包圍條件后,它會自動去掉AND的。
以上所述是小編給大家介紹的MyBatis使用動態SQL標簽的小陷阱,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/xinluwutu/archive/2016/10/13/5952285.html