MyBatis應用靜態SQL標簽的小圈套。本站提示廣大學習愛好者:(MyBatis應用靜態SQL標簽的小圈套)文章只能為提供參考,不一定能成為您想要的結果。以下是MyBatis應用靜態SQL標簽的小圈套正文
MyBatis是一個支撐通俗SQL查詢,存儲進程和高等映照的優良耐久層框架。MyBatis清除了簡直一切的JDBC代碼和參數的手工設置和對成果集的檢索封裝。MyBatis可使用簡略的XML或注解用於設置裝備擺設和原始映照,將接口和Java的POJO(Plain Old Java Objects,通俗的Java對象)映照成數據庫中的記載。
如今MyBatis愈來愈受年夜家的愛好了,它的優勢年夜家都曉得,我就不多說了,直接說重點。
MyBatis中供給靜態SQL功效,我們可使用<if><when><where><otherwise><foreach>等等,如許我們便可以寫出依據前提生成的靜態SQL了,然則,在這中央,我們常常用到的<if>標簽有一個小誤區,一不當心就會失落下去,上面先舉個正常的例子:
<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語句就是靜態的了。
然則,當我們對一切前提停止斷定時,你能否會如許寫:
<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的時刻,會湧現甚麼情形?
SELECT * FROM BLOG WHERE
看到了吧?如許的SQL能勝利履行麼?
謎底固然是NO。
那末該怎樣辦?那就要記住了,當你寫靜態SQL時刻,先斟酌一下會不會發生一切前提都不成立的情形,會不會湧現只要一個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也不會被拼上。
這時候,無機靈的小同伴發明了,假如第一個前提不成立,第二個成立,那SQL會不會釀成如許?
SELECT * FROM BLOG WHERE AND title like #{title}
這個就寧神好了,當你用<if>標簽包抄前提後,它會主動去失落AND的。
以上所述是小編給年夜家引見的MyBatis應用靜態SQL標簽的小圈套,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!