首頁 > 軟體

MyBatis解決模糊查詢包含特殊字元問題

2023-02-09 06:01:16

MyBatis解決模糊查詢包含特殊字元

第一塊:MyBatis 實現模糊查詢方式

1.1  sql中字串拼接

SELECT * FROM 表名 WHERE 欄位名 LIKE CONCAT(CONCAT('%', #{引數}), '%');

1 2. 使用 ${...} 代替 #{...}

SELECT * FROM 表名 WHERE 欄位名 LIKE '%${引數}%'; 

注意:($不能防止sql注入, #{}---> 可以防止sql注入的問題)

1.3 程式中拼接

Java 程式碼

String searchText = new StringBuilder("%").append(text).append("%").toString(); 
parameterMap.put("text", searchText);

Mapper 對映檔案

SELECT * FROM 表名 WHERE 欄位名 LIKE #{引數};

第二塊:MyBatis 實現特殊字元處理之<![CDATA[ ]]>

2.1 <![CDATA[ ]]> 簡介

它的全稱為character data,以"<![CDATA[ "開始,以" ]]>" 結束,在兩者之間嵌入不想被解析程式解析的原始資料,解析器不對CDATA區中的內容進行解析,而是將這些資料原封不動地交給下游程式處理。

2.2 MyBatis 自動跳脫特殊字元表

特殊字元替代符號
&&amp;
<&lt;
>&gt;
"&quot;
'&apos;

2.3 <![CDATA[ ]]> 特殊字元

xml 中表示:   <= 小於等於、    >= 大於等於 需加  這樣的標記:     <![CDATA[   ]]>      xml中有&的符號,需要

  • <![CDATA[&]]>這樣表示&
  • <= 小於等於 :<![CDATA[ <= ]]>
  • >= 大於等於:<![CDATA[  >=  ]]>

第三塊:模糊查詢包含特殊字元

解決辦法:使用 ${...} + <![CDATA[ ]]>

模板:

  <select id="searchAll" parameterType="map" resultType="map">
    SELECT 
        *
    FROM  表名 P
      WHERE 1=1 
    <if test="引數 != null and 引數 != ''">
        <![CDATA[ AND P.欄位名 LIKE '%${引數}%']]>
    </if>

MyBatis模糊查詢時對特殊字元"%"和"_"的處理

問題

輸入"%“或”_",查詢結果為全部資料,且無法查詢到帶有"%"或者下劃線 的資料。

解決

對特殊字元跳脫

例如查詢欄位為 name

若name中含有"%“或 “_” 轉為”/%" “/ _”

public void setName(String name) {
        this.name = StringUtils.isBlank(name) ? null : EscapeUtil.escapeChar(name);
    }
package com.xpf.util;

import org.apache.commons.lang3.StringUtils;

/**
 * @Title:EscapeUtil
 * @Package:com.xpf.util
 * @Author: xiapf
 * @Date:2019/9/20
 * @Descrption:
 */
public class EscapeUtil {
    /**
     * mysql的模糊查詢時特殊字元跳脫
     */
    public static String escapeChar(String before){
        if(StringUtils.isNotBlank(before)){
            before = before.replaceAll("_", "/_");
            before = before.replaceAll("%", "/%");
        }
        return before.trim() ;
    }
}

mapper中模糊查詢語句

name like CONCAT('%',#{name},'%') ESCAPE '/'

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com