MyBatis使用動態(tài)SQL標簽的小陷阱
MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設置以及對結(jié)果集的檢索封裝。MyBatis可以使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJO(Plain Old Java Objects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄。
現(xiàn)在MyBatis越來越受大家的喜愛了,它的優(yōu)勢大家都知道,我就不多說了,直接說重點。
MyBatis中提供動態(tài)SQL功能,我們可以使用<if><when><where><otherwise><foreach>等等,這樣我們就可以寫出根據(jù)條件生成的動態(tài)SQL了,但是,在這中間,我們經(jīng)常用到的<if>標簽有一個小誤區(qū),一不小心就會掉下去,下面先舉個正常的例子:
<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語句就是動態(tài)的了。
但是,當我們對所有條件進行判斷時,你是否會這樣寫:
<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的時候,會出現(xiàn)什么情況?
SELECT * FROM BLOG WHERE
看到了吧?這樣的SQL能成功執(zhí)行么?
答案當然是NO。
那么該怎么辦?那就要記住了,當你寫動態(tài)SQL時候,先考慮一下會不會產(chǎn)生所有條件都不成立的情況,會不會出現(xiàn)只有一個WHERE而沒有條件的情況,那么你要做的就是加一個<where>標簽將所有條件包起來。
<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也不會被拼上。
這時,有機靈的小伙伴發(fā)現(xiàn)了,如果第一個條件不成立,第二個成立,那SQL會不會變成這樣?
SELECT * FROM BLOG WHERE AND title like #{title}
這個就放心好了,當你用<if>標簽包圍條件后,它會自動去掉AND的。
以上所述是小編給大家介紹的MyBatis使用動態(tài)SQL標簽的小陷阱,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
spring task @Scheduled注解各參數(shù)的用法
這篇文章主要介紹了spring task @Scheduled注解各參數(shù)的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10微信支付java版V3驗證數(shù)據(jù)合法性(Deom)
這篇文章主要介紹了微信支付java版V3驗證數(shù)據(jù)合法性(Deom)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09Struts2中Action三種接收參數(shù)形式與簡單的表單驗證功能
本文以登錄驗證為例,進行代碼展示,下面給大家詳細介紹Struts2中Action三種接收參數(shù)形式與簡單的表單驗證功能,需要的朋友參考下2017-03-03Netty之使用DelimiterBasedFrameDecoder進行消息分隔詳解
這篇文章主要介紹了Netty之使用DelimiterBasedFrameDecoder進行消息分隔詳解,在使用Netty進行TCP消息傳輸時,為了上層協(xié)議能夠?qū)ο⒄_區(qū)分,避免粘包和拆包導致的問題,一般可以通過消息定長、將回車換行符作為消息結(jié)束符,需要的朋友可以參考下2023-12-12