91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決MyBatis中模糊搜索使用like匹配帶%字符時失效問題

發布時間:2021-09-28 10:48:22 來源:億速云 閱讀:716 作者:iii 欄目:開發技術

這篇文章主要講解了“如何解決MyBatis中模糊搜索使用like匹配帶%字符時失效問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何解決MyBatis中模糊搜索使用like匹配帶%字符時失效問題”吧!

目錄
  • 1.問題背景

  • 2.解決方法

    • 2.1.在入參SearchVo上進行特殊符號relpace轉換

    • 2.2.使用ESCAPE

    • 2.3.總結

1.問題背景

Mybatis是我們日常項目中經常使用的框架,在項目中我們一般會使用like查詢作為模糊匹配字符進行搜索匹配,下面的Mapper.xml是我們使用like在項目中進行模糊匹配的常用方式:

<sql id="searchCondition">
    <trim prefix="where" prefixOverrides="and|or">  
        <if test="paramVo.detail != null and paramVo.detail != '' ">
          and idwl.detail like concat('%', #{paramVo.detail, jdbcType=VARCHAR}, '%')
        </if>
     </trim>  
</sql>

這樣使用模糊查詢在分頁搜索中可以解決90%的匹配搜索功能,但是,還是有10%是陰溝翻船的事情。比如現在我要匹配文件名detail中帶有'%'的文件,使用這個語句就會造成搜索失效,直接返回表中的limit所有數據。

如何解決MyBatis中模糊搜索使用like匹配帶%字符時失效問題

造成這樣結果的原因就是由于像'%'或者'_'這樣的字符是通配字符,在模糊匹配的時候需要進行轉義執行,mysql執行解析器才會把它當成是單個字符進行匹配,否則則會按照匹配兩個''字符進行模糊匹配,得出全表搜索的錯誤結果。

2.解決方法

2.1.在入參SearchVo上進行特殊符號relpace轉換

使用Vo入參接收類對前端傳入的detail字段進行判別處理,優先替換replace特殊字符:

public class SerachParamVO {
    private String productVersion;
    private String detail;
    private Integer releaseType;
    private String createUser;
    private String createUserAccount;
    private Date createTime;
    private String description;

    public void setDetail(String detail) {
        this.detail = detail.replaceAll("%", "\\\\%")
                .replaceAll("_", "\\\\_");
    }
}

2.2.使用ESCAPE

使用ESCAPE:escape簡單來說就是escape '字符',表示在like中從帶有'字符'之后不再作為通配字符具有特殊含義,escape的理解可以參考另外一篇博客:

MYSQL escape用法,這里就不再做詳細介紹。

對應的解決方式如下:

①修改sql查詢語句,添加escape:

<sql id="searchCondition">
    <trim prefix="where" prefixOverrides="and|or">  
        <if test="paramVo.detail != null and paramVo.detail != '' ">
          and idwl.detail like concat('%', #{paramVo.detail, jdbcType=VARCHAR}, '%') escape '/'
        </if>
     </trim>  
</sql>

②傳入SearchVo進行通配符設置:

public class SerachParamVO {
    private String productVersion;
    private String detail;
    private Integer releaseType;
    private String createUser;
    private String createUserAccount;
    private Date createTime;
    private String description;

    public void setDetail(String detail) {
        this.detail = detail.replaceAll("%", "/%")
                .replaceAll("_", "/_");
    }
}

感謝各位的閱讀,以上就是“如何解決MyBatis中模糊搜索使用like匹配帶%字符時失效問題”的內容了,經過本文的學習后,相信大家對如何解決MyBatis中模糊搜索使用like匹配帶%字符時失效問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

遂溪县| 松阳县| 乌兰浩特市| 巨鹿县| 泰安市| 遵义市| 乐业县| 龙江县| 伊春市| 丰台区| 巨鹿县| 来凤县| 安远县| 枞阳县| 武义县| 惠安县| 苏尼特右旗| 陇川县| 寿宁县| 英吉沙县| 抚顺县| 永春县| 亳州市| 法库县| 永济市| 瑞丽市| 通道| 开远市| 时尚| 九寨沟县| 石楼县| 吴堡县| 社会| 岳普湖县| 新丰县| 全州县| 青浦区| 宕昌县| 桑日县| 五指山市| 怀集县|