Mybatis where 1=1 動態sql問題
where 1=1和 where 標籤
<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’
where 標籤
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 元素也會將它們去除。
或者使用 where 1=1
where 1=1
1=1 永真, 1<>1 永假。
select * from sys_voter where 1<>1 這句查詢出來的是 只要表結構不要表資料;
select * from sys_voter t where 1=1 查詢全部資料
使用者在條件查詢時,你用了 where 1=1 ;
無論使用者是否查詢了,你都可以不用判斷某個欄位為空不為空;
保證 sql語句還能一直執行不報錯;
如果 where 元素與你期望的不太一樣,你也可以通過自定義 trim 元素來定製 where 元素的功能。比如,和 where 元素等價的自定義 trim 元素為:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
prefixOverrides 屬性會忽略通過管道符分隔的文字序列(注意此例中的空格是必要的)。上述例子會移除所有 prefixOverrides 屬性中指定的內容,並且插入 prefix 屬性中指定的內容。
相關文章
- 1 Mybatis動態SQLMyBatisSQL
- MyBatis系列(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- MyBatis 動態 SQLMyBatisSQL
- mybatis動態SQLMyBatisSQL
- 【轉】LINQ to SQL語句(1)之WhereSQL
- Mybatis N+1問題解析MyBatis
- MyBatis從入門到精通(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- MyBatis(七) 動態SQLMyBatisSQL
- Mybatis--動態SQLMyBatisSQL
- Mybatis 裡對映檔案的動態 SQL 語句,實現if,where,foreache的SQL語句動態拼接查詢MyBatisSQL
- MySQL-where 1=1MySql
- mybatis動態sql總結MyBatisSQL
- Mybatis-06 動態SqlMyBatisSQL
- 0-1揹包問題(動態規劃)動態規劃
- 動態規劃之0,1揹包問題動態規劃
- 動態規劃解0-1揹包問題動態規劃
- MyBatis對動態SQL的支援MyBatisSQL
- mybatis動態sql與分頁MyBatisSQL
- Java-Mybatis動態SQL整理JavaMyBatisSQL
- Mybatis介紹之 動態SQLMyBatisSQL
- 為什麼要用where 1=1
- where 1=1有什麼用?
- where 1=1 是什麼鬼?
- MyBatis框架之SQL對映和動態SQLMyBatis框架SQL
- hive Sql的動態分割槽問題HiveSQL
- Mybatis 動態執行SQL語句MyBatisSQL
- 動態規劃之 0-1 揹包問題詳解動態規劃
- 【MyBatis學習總結 (五),動態SQL】MyBatisSQL
- 【動態規劃】0-1揹包問題原理和實現動態規劃
- ABAP 動態where語句
- java動態代理(1)Java
- MyBatis 動態 SQL 最全教程,這樣寫 SQL 太優雅了!MyBatisSQL
- MyBatis標籤實現的動態SQL語句MyBatisSQL
- Mybatis(一)Porxy動態代理和sql解析替換MyBatisSQL
- 關於IDEA使用xml實現動態sql的問題IdeaXMLSQL
- 移動端1px邊框問題
- MyBatis從入門到精通(六):MyBatis動態Sql之if標籤的用法MyBatisSQL
- Excel動態日曆1Excel