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
- SQL Where in list 問題SQL
- Mybatis N+1問題解析MyBatis
- MyBatis 動態 SQLMyBatisSQL
- mybatis動態SQLMyBatisSQL
- MyBatis-動態SQL的if、choose、when、otherwise、trim、where、set、foreach使用MyBatisSQL
- MyBatis從入門到精通(七):MyBatis動態Sql之choose,where,set標籤的用法MyBatisSQL
- MySQL-where 1=1MySql
- Mybatis--動態SQLMyBatisSQL
- MyBatis(七) 動態SQLMyBatisSQL
- 【轉】LINQ to SQL語句(1)之WhereSQL
- MyBatis基礎:MyBatis動態SQL(3)MyBatisSQL
- 0-1揹包問題(動態規劃)動態規劃
- Mybatis 裡對映檔案的動態 SQL 語句,實現if,where,foreache的SQL語句動態拼接查詢MyBatisSQL
- mybatis動態sql總結MyBatisSQL
- Mybatis-06 動態SqlMyBatisSQL
- Mybatis 動態 SQL 詳解MyBatisSQL
- MyBatis4:動態SQLMyBatisSQL
- 【MyBatis】1:JDBC程式設計存在的問題MyBatisJDBCC程式程式設計
- 動態規劃之0,1揹包問題動態規劃
- 動態規劃解0-1揹包問題動態規劃
- 0-1揹包問題 動態規劃法動態規劃
- Mybatis介紹之 動態SQLMyBatisSQL
- Java-Mybatis動態SQL整理JavaMyBatisSQL
- MyBatis對動態SQL的支援MyBatisSQL
- mybatis動態sql與分頁MyBatisSQL
- 學習動態效能表(三)-(1)-v$sqlSQL
- MyBatis框架之SQL對映和動態SQLMyBatis框架SQL
- Mybatis 動態執行SQL語句MyBatisSQL
- Mybatis深入瞭解(五)----動態SQLMyBatisSQL
- 動態規劃之 0-1 揹包問題詳解動態規劃
- hive Sql的動態分割槽問題HiveSQL
- 【動態規劃】0-1揹包問題原理和實現動態規劃
- 【MyBatis學習總結 (五),動態SQL】MyBatisSQL
- Mybatis學習筆記(6)-動態SQLMyBatis筆記SQL
- mybatis入門基礎(五)----動態SQLMyBatisSQL
- ABAP 動態where語句