mybatis 為什麼千萬不要使用 where 1=1
1.解決方案
下面是mybatis查詢語句,如果我們這次我們將 “state = ‘ACTIVE’” 設置成動態條件,看看會發生什麼。
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </select>
如果沒有匹配的條件會怎麼樣?最終這條 SQL 會變成這樣:
SELECT * FROM BLOG WHERE
這會導致查詢失敗。如果匹配的隻是第二個條件又會怎樣?這條 SQL 會是這樣:
SELECT * FROM BLOG WHERE AND title like ‘someTitle'
這個查詢也會失敗。這個問題不能簡單地用條件元素來解決。這個問題是如此的難以解決,以至於解決過的人不會再想碰到這種問題。
MyBatis 有一個簡單且適合大多數場景的解決辦法。而在其他場景中,可以對其進行自定義以符合需求。而這,隻需要一處簡單的改動:
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG <where> <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </where> </select>
where 元素隻會在子元素返回任何內容的情況下才插入 “WHERE” 子句。而且,若子句的開頭為 “AND” 或 “OR”,where 元素也會將它們去除。
2.為什麼不能使用1=1
1.會導致表中的數據索引失效
2.垃圾條件,沒必要加
3.官方文檔地址
mybatis官網地址
到此這篇關於mybatis 為什麼千萬不要使用 where 1=1的文章就介紹到這瞭,更多相關mybatis where1=1內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- mybatis動態sql常用場景總結
- 基於mybatis 動態SQL查詢總結
- 關於Mybatis動態sql中test的坑點總結
- 給新來的同事講where 1=1是什麼意思
- mybatis動態SQL if的test寫法及規則詳解