MybatisPlus之likeRight的用法
關(guān)于likeRight的用法
在使用Mybatis-plus的時(shí)候,使用like方法發(fā)現(xiàn)匹配的方法和自己想的相反,特此記錄下:
使用場(chǎng)景:
我想要查詢分類(lèi)的某一層級(jí)下的訂單,如下圖,我想查詢所有“男裝”訂單

那么,如果是寫(xiě)SQL查詢就是這樣
select xx,xx from order_info where category_id like '10,20%';
可是,項(xiàng)目如果使用的是Mybatis-plus,那么我們?cè)撛趺磳?xiě)呢?
最開(kāi)始我想的是,likeLeft就是左匹配嘛,就按照下面這么寫(xiě):
this.list(Wrappers.<OrderInfo>lambdaQuery().likeLeft(OrderInfo::getCategoryId,orderQueryReq.getCategoryId()).eq(OrderInfo::getStatus,99));
哦豁,沒(méi)查到數(shù)據(jù)。然后就換成likeRight之后,bingo 數(shù)據(jù)出來(lái)了:

然后,我就默默的去看了下源碼(從上到下,層層遞進(jìn),直到最后我們找到了轉(zhuǎn)換SQL的地方,對(duì)!就是那個(gè)SqlUtils):
default Children likeRight(R column, Object val) {
return this.likeRight(true, column, val);
}
Children likeRight(boolean condition, R column, Object val);
public Children likeRight(boolean condition, R column, Object val) {
this.getWrapper().likeRight(condition, column, val);
return this.typedThis;
}
public Children likeRight(boolean condition, R column, Object val) {
return this.likeValue(condition, column, val, SqlLike.RIGHT);
}
protected Children likeValue(boolean condition, R column, Object val, SqlLike sqlLike) {
return this.doIt(condition, () -> {
return this.columnToString(column);
}, SqlKeyword.LIKE, () -> {
return this.formatSql("{0}", SqlUtils.concatLike(val, sqlLike));
});
}
public static String concatLike(Object str, SqlLike type) {
switch (type) {
case LEFT:
return "%" + str;
case RIGHT:
return str + "%";
default:
return "%" + str + "%";
}
}原來(lái),它的likeLeft就是‘%’這個(gè)玩意兒加在左側(cè),likeRight就是加在右側(cè),默認(rèn)就是兩邊都加,也就是like?。?!
使用like與likeright方法查詢信息的踩坑
先說(shuō)結(jié)論,like 和 likeRight的區(qū)別就是
like:填入query的參數(shù)兩端加上通配符,會(huì)進(jìn)行左右兩端進(jìn)行l(wèi)ike匹配likeRight:只給填入?yún)?shù)的右端加入通配符進(jìn)行匹配。
所以使用的時(shí)候要搞清楚自己的需求,盲目使用like查詢會(huì)造成隱患。
案例
想要抽取 一串?dāng)?shù)字第7和8位組成是03的數(shù)據(jù)。
例子
2022010101
2022010203
2022010302
2022020102
2022020204
2022020301
結(jié)果應(yīng)該是第3個(gè)和第6個(gè)。
然后我的like語(yǔ)句是
like("number", "______" + 03 + "%") //下劃線_ 代表占位符,表示這個(gè)位置的數(shù)字隨意,但是一個(gè)占位符表示只能有一個(gè)字符,意思表示為:前面6位數(shù)字隨意。但第7,8位必須要03.
然而結(jié)果是第2,3,6個(gè),這個(gè)結(jié)果導(dǎo)致我一系列操作直接全部迷惑操作,把數(shù)據(jù)全大變樣。
最后知道原因,原來(lái)mybatisplus的like方法,會(huì)在執(zhí)行sql的時(shí)候給參數(shù)前后都加上%,這就導(dǎo)致我的6個(gè)下劃線失效, 所以數(shù)據(jù)混亂。
然后我換成likeRight就結(jié)果問(wèn)題了,在找bug的時(shí)候,我從前端找到后端,從頁(yè)面找到請(qǐng)求,再檢查有沒(méi)有寫(xiě)錯(cuò),最后發(fā)現(xiàn),數(shù)據(jù)庫(kù)這里出錯(cuò)了,費(fèi)了好大勁,太難了。
以后用like查詢的時(shí)候可要用對(duì)了,還是沒(méi)有系統(tǒng)的學(xué)習(xí)mybatisplus,基礎(chǔ)不好所導(dǎo)致的問(wèn)題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)學(xué)生成績(jī)信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生成績(jī)信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
Java中BeanUtils.copyProperties()詳解及應(yīng)用場(chǎng)景
BeanUtils.copyProperties()是Apache?Commons?BeanUtils提供的方法,用于Java對(duì)象間屬性的復(fù)制,特別適用于DTO、VO和Entity之間的數(shù)據(jù)傳遞,這篇文章主要介紹了Java中BeanUtils.copyProperties()詳解及應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下2024-09-09
Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn)
這篇文章主要介紹了Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
java Spring MVC4環(huán)境搭建實(shí)例詳解(步驟)
spring WEB MVC框架提供了一個(gè)MVC(model-view-controller)模型-視圖-控制器的結(jié)構(gòu)和組件,利用它可以開(kāi)發(fā)更靈活、松耦合的web應(yīng)用。MVC模式使得整個(gè)服務(wù)應(yīng)用的各部分(控制邏輯、業(yè)務(wù)邏輯、UI界面展示)分離開(kāi)來(lái),使它們之間的耦合性更低2017-08-08
vscode快速引入第三方j(luò)ar包發(fā)QQ郵件
這篇文章主要介紹了vscode快速引入第三方j(luò)ar包發(fā)QQ郵件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java語(yǔ)法基礎(chǔ)之運(yùn)算符學(xué)習(xí)筆記分享
這篇文章主要為大家分享了Java語(yǔ)法基礎(chǔ)之運(yùn)算符學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Java學(xué)習(xí)之如何進(jìn)行JSON解析
JSON(JavaScript?Object?Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,它算是JavaScript語(yǔ)言的一部分,與XML一樣都可以用于數(shù)據(jù)的存儲(chǔ)和傳輸,本文講給大家介紹如何進(jìn)行JSON解析,需要的朋友可以參考下2023-12-12

