mybatis 對特殊字元的模糊查詢

陳晨辰~發表於2020-11-05

mybatis使用模糊搜尋的時候,對萬用字元會進行轉義,類似%_這些特殊符號都不會被作為字串進行搜尋

例如:

<if test="name != null and name != ''" >
    AND content.name like CONCAT(#{name},'%')
</if>

按原先的預想是該欄位會進行左匹配,如果入參name是%測試%,則實際上搜尋的是全匹配搜尋了帶有測試的所有值。

原因就是使用 LIKE 關鍵字進行模糊查詢時,%、下劃線 和 [] 單獨出現時,會被認為是萬用字元,所以需要進行轉義,然後通過 ESCAPE 告訴資料庫轉義字元後的字元為實際值。

首先對關鍵字進行轉義

        if (keyWord != null) {
            keyWord = keyWord.replaceAll("_", "/_");
        }
/**
* 把模糊查詢的檢索的關鍵字對特殊字元進行轉換如 “[”、“%”
* @param str
* 需要轉換的字串
* @return 返回模糊查詢的字串
*/
public static String ToLikeStr(String str)
{
if(str != null && str.length()>0)
{
str =str.trim().replace("\\", "\\\\%").replace("%", "\\%").replace("_", "\\_");
}
return str ;
//	str = 
}

 

在 mabatis 的 mapper 檔案中,在 like 語句後面加上 ESCAPE,告訴資料庫轉義字元為 “/”

like #{pattern_keyWord} ESCAPE '/'

 

也可以使用內建函式來進行模糊搜尋 (locate () 等)

1、使用 locate ()

select `name` from `user` where locate('keyword', `condition`)>0

找到返回的結果都大於 0,沒有查詢到返回 0;

2、使用 instr ()

select`name` from `user` where instr(`condition`, ‘keyword’ )>0

唯一不同的是查詢內容的位置不同

3、使用 position ()

select`name` from `user` where position(‘keyword’ IN `condition`)

4、使用 find_in_set ()

find_in_set (str,strlist),strlist 必須要是以逗號分隔的字串

 

參考:

https://blog.csdn.net/wslyk606/article/details/85321759

https://www.baidu.com/link?url=vVdwynxLrMPE-WMbEROJ5PrwhIv9V8pLm7h9dgu8JzmxVP4ulUv5hqIOuNFMWsaoeNGxIIpyuMsijxnAovLp2a&wd=&eqid=f256af3a000133a6000000065fa3e6eb

https://baijiahao.baidu.com/s?id=1649824285248362226&wfr=spider&for=pc

相關文章