mybatis like模糊查詢特殊字符報錯轉義處理方式

like模糊查詢特殊字符報錯轉義處理

方案1

    <if test="projectName!=null and projectName!=''">
            <bind name="projectName_" value="'%'+projectName+'%'"/>
            AND info.name like #{projectName_}
        </if>

方案2

    <if test="projectName!=null and projectName!=''">
            AND info.name like concat('%',#{projectName_},'%')
        </if>

like模糊查詢中包含有特殊字符(_、\、%)

使用MyBatis中的模糊查詢時,當查詢關鍵字中包括有_、\、%時,查詢關鍵字失效。

  • 當like中包含_時,查詢仍為全部,即 like '%_%'查詢出來的結果與like '%%'一致,並不能查詢出實際字段中包含有_特殊字符的結果條目
  • like中包括%時,與1中相同
  • like中包含\時,帶入查詢時,%%無法查詢到包含字段中有\的條目

處理

工具類:特殊字符轉義

import org.apache.commons.lang3.StringUtils; 
public class EscapeUtil {
    //mysql的模糊查詢時特殊字符轉義
    public static String escapeChar(String before){
        if(StringUtils.isNotBlank(before)){
            before = before.replaceAll("\\\\", "\\\\\\\\");
            before = before.replaceAll("_", "\\\\_");
            before = before.replaceAll("%", "\\\\%");
        }
        return before ;
    }
}

註意

以上方法在關鍵字中包含有\可能會失效,失效的原因是由於查詢的關鍵字的數據庫字段排序規則為utf8_unicode_ci,要想不失效,查詢的關鍵字的排序規則必須為utf8_general_ci,或者統一全部數據庫字符集與排序規則分別為:utf8mb4與utf8mb4_general_ci

這些僅為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。 

推薦閱讀: