最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis Plus like參數(shù)為百分號(hào)%查詢(xún)結(jié)果異常原因分析及解決

 更新時(shí)間:2025年09月25日 09:03:34   作者:_院長(zhǎng)大人_  
文章指出在MyBatisPlus使用LIKE查詢(xún)時(shí),用戶(hù)輸入的%可能導(dǎo)致通配符誤匹配,推薦使用ESCAPE轉(zhuǎn)義功能,將%轉(zhuǎn)換為普通字符,既支持模糊查詢(xún)又避免全表匹配,提升準(zhǔn)確性和性能

在日常開(kāi)發(fā)中,我們經(jīng)常使用 MyBatis Plus 進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)。其中,LIKE 關(guān)鍵字用于模糊匹配,但如果用戶(hù)輸入的查詢(xún)條件包含 %,可能會(huì)導(dǎo)致查詢(xún)結(jié)果異常。

如下圖,數(shù)據(jù)庫(kù)里面是沒(méi)有%的plate_number數(shù)據(jù)的,但是查詢(xún)出86條數(shù)據(jù)

問(wèn)題分析

我們來(lái)看一段 MyBatis Plus 的查詢(xún)代碼:

queryWrapper
    .like(StringUtils.hasText(reqVo.getPlateNumber()), HlCar::getPlateNumber, reqVo.getPlateNumber())
    .like(StringUtils.hasText(reqVo.getVin()), HlCar::getVin, reqVo.getVin())
    .like(StringUtils.hasText(reqVo.getModelName()), HlCar::getCarSeries, reqVo.getModelName());

該代碼的意圖是:

  • 如果 reqVo.getPlateNumber()、reqVo.getVin()reqVo.getModelName()非空,則執(zhí)行 LIKE 查詢(xún)。
  • 例如,用戶(hù)輸入 "ABC",SQL 語(yǔ)句應(yīng)為:
SELECT * FROM hl_car WHERE plate_number LIKE '%ABC%'

這樣可以查詢(xún)出包含 "ABC" 的所有車(chē)牌。

問(wèn)題出現(xiàn)的情況

  • 如果用戶(hù)輸入了 %,如 "%",SQL 會(huì)變成:
SELECT * FROM hl_car WHERE plate_number LIKE '%%%'

由于 % 在 SQL LIKE 語(yǔ)句中是通配符,它會(huì)匹配任意字符,這可能導(dǎo)致匹配出比預(yù)期更多的數(shù)據(jù)。

  • 如果用戶(hù)僅輸入 %,則 LIKE '%%%' 會(huì)匹配所有數(shù)據(jù),完全失去篩選作用。

查詢(xún)結(jié)果不符合預(yù)期,可能導(dǎo)致:

  1. 查詢(xún)數(shù)據(jù)量過(guò)大,影響系統(tǒng)性能。
  2. 業(yè)務(wù)邏輯錯(cuò)誤,返回了不相關(guān)的數(shù)據(jù)。

解決方案

方法 1:去除%,只匹配真實(shí)字符(不推薦)

一種簡(jiǎn)單的方式是移除 %,讓 LIKE 只匹配實(shí)際輸入的內(nèi)容。

String plateNumber = reqVo.getPlateNumber() != null ? reqVo.getPlateNumber().replace("%", "").trim() : null;
String vin = reqVo.getVin() != null ? reqVo.getVin().replace("%", "").trim() : null;
String modelName = reqVo.getModelName() != null ? reqVo.getModelName().replace("%", "").trim() : null;

queryWrapper
.like(StringUtils.hasText(plateNumber), HlCar::getPlateNumber, plateNumber)
.like(StringUtils.hasText(vin), HlCar::getVin, vin)
.like(StringUtils.hasText(modelName), HlCar::getCarSeries, modelName);

缺點(diǎn)

  • 如果用戶(hù)查詢(xún) "100%ABC",會(huì)變成 "100ABC",查詢(xún)結(jié)果不準(zhǔn)確。
  • 失去了 % 作為普通字符的意義,不能搜索包含 % 的數(shù)據(jù)。

方法 2:使用eq()進(jìn)行精確匹配(適用于完全匹配查詢(xún))

如果 plateNumber 是用戶(hù)完整輸入的車(chē)牌號(hào),VIN 碼和 車(chē)型名 也是完整的,則可以使用 eq()

queryWrapper.eq(StringUtils.hasText(plateNumber), HlCar::getPlateNumber, plateNumber)
.eq(StringUtils.hasText(vin), HlCar::getVin, vin)
.eq(StringUtils.hasText(modelName), HlCar::getCarSeries, modelName);

優(yōu)點(diǎn)

  • 精準(zhǔn)匹配,不會(huì)因?yàn)?% 影響查詢(xún)結(jié)果。
  • 適用于 VIN 碼、車(chē)牌號(hào)等完整匹配的查詢(xún)。

缺點(diǎn)

  • 不能進(jìn)行模糊匹配,用戶(hù)必須輸入完整的車(chē)牌號(hào)或 VIN 才能查到數(shù)據(jù)。

方法 3:使用轉(zhuǎn)義%(推薦本次使用)**

%_使用escapeLike方法轉(zhuǎn)義轉(zhuǎn)義

Java 代碼

// 處理 LIKE 查詢(xún)參數(shù),轉(zhuǎn)義 % 和 _
String escapeLike(String str) {
return str != null ? str.replace("%", "\\%").replace("_", "\\_").trim() : null;
}

// 轉(zhuǎn)義參數(shù)
String plateNumber = escapeLike(reqVo.getPlateNumber());
String vin = escapeLike(reqVo.getVin());
String modelName = escapeLike(reqVo.getModelName());

// 避免 `null` 參數(shù)
if (StringUtils.hasText(plateNumber)) {
    queryWrapper.like(HlCar::getPlateNumber, plateNumber);
}
if (StringUtils.hasText(vin)) {
    queryWrapper.like(HlCar::getVin, vin);
}
if (StringUtils.hasText(modelName)) {
    queryWrapper.like(HlCar::getCarSeries, modelName);
}

SQL 解析

如果用戶(hù)輸入 "100%ABC",SQL 語(yǔ)句會(huì)變成:

SELECT * FROM hl_car WHERE plate_number LIKE '100\%ABC'
  • %% 變成普通字符,不再作為通配符。
  • 這樣可以正確匹配 100%ABC,而不會(huì)匹配 100XYZABC

優(yōu)點(diǎn)

  • 支持模糊查詢(xún),但不會(huì)誤匹配。
  • 不會(huì)影響查詢(xún)數(shù)據(jù)的完整性,能夠正確匹配包含 % 的車(chē)牌號(hào)或 VIN。

修改后執(zhí)行結(jié)果

  • 可以看到查詢(xún)正常了
  • 在這里插入圖片描述


最佳實(shí)踐推薦

方法適用場(chǎng)景是否支持 %
作為普通字符
是否支持模糊匹配
方法 1:去掉%適用于只需要模糊查詢(xún)的情況?(去掉 %
影響查詢(xún)結(jié)果)
?
方法 2:用 eq()
精確匹配
適用于 VIN 碼、完整車(chē)牌匹配??
方法 3:用 ESCAPE
轉(zhuǎn)義(推薦)
適用于所有 LIKE 查詢(xún)??

綜合來(lái)看,方法 3(使用 ESCAPE)是最優(yōu)解,兼顧了模糊匹配和 % 作為普通字符的問(wèn)題。

總結(jié)

在 MyBatis Plus LIKE 查詢(xún)時(shí),如果 plateNumbervinmodelName 含有 %,會(huì)導(dǎo)致誤匹配。

直接 LIKE '%' 會(huì)查詢(xún)所有數(shù)據(jù),可能影響業(yè)務(wù)邏輯。

解決方案:

  1. 去掉 %(不推薦)
  2. 改用 eq() 精確匹配(適用于完整匹配)
  3. 使用 ESCAPE 轉(zhuǎn)義 %(推薦)

正確使用 LIKE 查詢(xún),能避免數(shù)據(jù)誤匹配,提高查詢(xún)準(zhǔn)確性和系統(tǒng)性能!

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中的this引用及對(duì)象構(gòu)造初始化

    java中的this引用及對(duì)象構(gòu)造初始化

    這篇文章主要介紹了java中的this引用及對(duì)象構(gòu)造初始化,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 聊聊Object類(lèi)中的wait()和notify()方法

    聊聊Object類(lèi)中的wait()和notify()方法

    這篇文章主要介紹了Object類(lèi)中的wait()和notify()方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot集成Redis之RedisTemplate實(shí)踐

    SpringBoot集成Redis之RedisTemplate實(shí)踐

    文章介紹了在使用SpringBoot與Redis進(jìn)行交互時(shí),遇到的中文亂碼問(wèn)題,并提供兩種解決方法:1) 使用StringRedisTemplate;2) 自定義Redis序列化器,同時(shí),還討論了在集群模式下,若主機(jī)宕機(jī),客戶(hù)端如何動(dòng)態(tài)感知集群狀態(tài)
    2026-04-04
  • JavaWeb簡(jiǎn)單文件上傳流程的實(shí)戰(zhàn)記錄

    JavaWeb簡(jiǎn)單文件上傳流程的實(shí)戰(zhàn)記錄

    在Web應(yīng)用系統(tǒng)開(kāi)發(fā)中,文件上傳和下載功能是非常常用的功能,下面這篇文章主要給大家介紹了關(guān)于JavaWeb實(shí)現(xiàn)簡(jiǎn)單文件上傳流程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Java中的OkHttpClient 工具類(lèi)

    Java中的OkHttpClient 工具類(lèi)

    這篇文章主要介紹了Java中的OkHttpClient工具類(lèi),具有很好的參考價(jià)值,希望杜大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解五種方式讓你在java中讀取properties文件內(nèi)容不再是難題

    詳解五種方式讓你在java中讀取properties文件內(nèi)容不再是難題

    這篇文章主要介紹了詳解五種方式讓你在java中讀取properties文件內(nèi)容不再是難題 ,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-12-12
  • hibernate-validator如何使用校驗(yàn)框架

    hibernate-validator如何使用校驗(yàn)框架

    高效、合理的使用hibernate-validator校驗(yàn)框架可以提高程序的可讀性,以及減少不必要的代碼邏輯,本文主要介紹了hibernate-validator如何使用校驗(yàn)框架,感興趣的可以了解一下
    2022-04-04
  • 一個(gè)簡(jiǎn)單的java學(xué)生寢室查詢(xún)系統(tǒng)

    一個(gè)簡(jiǎn)單的java學(xué)生寢室查詢(xún)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了一個(gè)簡(jiǎn)單的java學(xué)生寢室查詢(xún)系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 深入淺析java中flyway使用簡(jiǎn)介

    深入淺析java中flyway使用簡(jiǎn)介

    Flyway是獨(dú)立于數(shù)據(jù)庫(kù)的應(yīng)用、管理并跟蹤數(shù)據(jù)庫(kù)變更的數(shù)據(jù)庫(kù)版本管理工具。這篇文章主要介紹了flyway使用簡(jiǎn)介,需要的朋友可以參考下
    2020-07-07
  • Spring Boot支持Crontab任務(wù)改造的方法

    Spring Boot支持Crontab任務(wù)改造的方法

    這篇文章主要介紹了Spring Boot支持Crontab任務(wù)改造的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01

最新評(píng)論

陵水| 上思县| 岱山县| 剑阁县| 西乌珠穆沁旗| 台前县| 榕江县| 平安县| 宁城县| 璧山县| 张掖市| 通渭县| 三台县| 吉林市| 甘德县| 香格里拉县| 同心县| 嘉黎县| 宕昌县| 保靖县| 炎陵县| 巴马| 呼玛县| 微博| 龙海市| 山西省| 睢宁县| 沁水县| 鸡泽县| 宁津县| 和林格尔县| 万盛区| 延长县| 麟游县| 广饶县| 阳西县| 子洲县| 曲周县| 陵川县| 丹江口市| 故城县|