mybatis 為什么千萬不要使用 where 1=1
下面是mybatis查詢語句,如果我們這次我們將 “state = ‘ACTIVE’” 設(shè)置成動(dòng)態(tài)條件,看看會(huì)發(fā)生什么。
<select 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>
如果沒有匹配的條件會(huì)怎么樣?最終這條 SQL 會(huì)變成這樣:
SELECT * FROM BLOGWHERE
這會(huì)導(dǎo)致查詢失敗。如果匹配的只是第二個(gè)條件又會(huì)怎樣?這條 SQL 會(huì)是這樣:
SELECT * FROM BLOGWHEREAND title like ‘someTitle’
這個(gè)查詢也會(huì)失敗。這個(gè)問題不能簡單地用條件元素來解決。這個(gè)問題是如此的難以解決,以至于解決過的人不會(huì)再想碰到這種問題。
MyBatis 有一個(gè)簡單且適合大多數(shù)場(chǎng)景的解決辦法。而在其他場(chǎng)景中,可以對(duì)其進(jìn)行自定義以符合需求。而這,只需要一處簡單的改動(dòng):
<select 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 元素只會(huì)在子元素返回任何內(nèi)容的情況下才插入 “WHERE” 子句。而且,若子句的開頭為 “AND” 或 “OR”,where 元素也會(huì)將它們?nèi)コ?/p>2.為什么不能使用1=1
1.會(huì)導(dǎo)致表中的數(shù)據(jù)索引失效2.垃圾條件,沒必要加
3.官方文檔地址mybatis官網(wǎng)地址
到此這篇關(guān)于mybatis 為什么千萬不要使用 where 1=1的文章就介紹到這了,更多相關(guān)mybatis where1=1內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. 如何實(shí)現(xiàn)MySQL數(shù)據(jù)庫的備份與恢復(fù)2. MySQL如何使用授權(quán)命令grant3. mysql數(shù)據(jù)庫中最常用的時(shí)間轉(zhuǎn)換函數(shù)的用法4. Mysql入門系列:對(duì)MYSQL查詢中有疑問的數(shù)據(jù)進(jìn)行編碼5. Mysql事務(wù)特性和級(jí)別原理解析6. SQL Server中使用DTS設(shè)計(jì)器進(jìn)行數(shù)據(jù)轉(zhuǎn)移8. 如何將mysql表的內(nèi)容追加導(dǎo)入另一張表9. MySql導(dǎo)出后再導(dǎo)入數(shù)據(jù)時(shí)出錯(cuò)問題10. Delphi中的Access技巧集

網(wǎng)公網(wǎng)安備