MybatisPlus之likeRight的用法
關(guān)于likeRight的用法
在使用Mybatis-plus的時(shí)候,使用like方法發(fā)現(xiàn)匹配的方法和自己想的相反,特此記錄下:
使用場景:
我想要查詢分類的某一層級下的訂單,如下圖,我想查詢所有“男裝”訂單
那么,如果是寫SQL查詢就是這樣
select xx,xx from order_info where category_id like '10,20%';
可是,項(xiàng)目如果使用的是Mybatis-plus,那么我們該怎么寫呢?
最開始我想的是,likeLeft就是左匹配嘛,就按照下面這么寫:
this.list(Wrappers.<OrderInfo>lambdaQuery().likeLeft(OrderInfo::getCategoryId,orderQueryReq.getCategoryId()).eq(OrderInfo::getStatus,99));
哦豁,沒查到數(shù)據(jù)。然后就換成likeRight之后,bingo 數(shù)據(jù)出來了:
然后,我就默默的去看了下源碼(從上到下,層層遞進(jìn),直到最后我們找到了轉(zhuǎn)換SQL的地方,對!就是那個(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 + "%"; } }
原來,它的likeLeft就是‘%’這個(gè)玩意兒加在左側(cè),likeRight就是加在右側(cè),默認(rèn)就是兩邊都加,也就是like!??!
使用like與likeright方法查詢信息的踩坑
先說結(jié)論,like 和 likeRight的區(qū)別就是
like
:填入query的參數(shù)兩端加上通配符,會進(jìn)行左右兩端進(jìn)行l(wèi)ike匹配likeRight
:只給填入?yún)?shù)的右端加入通配符進(jìn)行匹配。
所以使用的時(shí)候要搞清楚自己的需求,盲目使用like查詢會造成隱患。
案例
想要抽取 一串?dāng)?shù)字第7和8位組成是03的數(shù)據(jù)。
例子
2022010101
2022010203
2022010302
2022020102
2022020204
2022020301
結(jié)果應(yīng)該是第3個(gè)和第6個(gè)。
然后我的like語句是
like("number", "______" + 03 + "%") //下劃線_ 代表占位符,表示這個(gè)位置的數(shù)字隨意,但是一個(gè)占位符表示只能有一個(gè)字符,意思表示為:前面6位數(shù)字隨意。但第7,8位必須要03.
然而結(jié)果是第2,3,6個(gè),這個(gè)結(jié)果導(dǎo)致我一系列操作直接全部迷惑操作,把數(shù)據(jù)全大變樣。
最后知道原因,原來mybatisplus的like方法,會在執(zhí)行sql的時(shí)候給參數(shù)前后都加上%,這就導(dǎo)致我的6個(gè)下劃線失效, 所以數(shù)據(jù)混亂。
然后我換成likeRight就結(jié)果問題了,在找bug的時(shí)候,我從前端找到后端,從頁面找到請求,再檢查有沒有寫錯(cuò),最后發(fā)現(xiàn),數(shù)據(jù)庫這里出錯(cuò)了,費(fèi)了好大勁,太難了。
以后用like查詢的時(shí)候可要用對了,還是沒有系統(tǒng)的學(xué)習(xí)mybatisplus,基礎(chǔ)不好所導(dǎo)致的問題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Java8實(shí)現(xiàn)提高Excel讀寫效率
這篇文章主要介紹了基于Java8實(shí)現(xiàn)提高Excel讀寫效率,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))
這篇文章主要介紹了Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05SpringBoot自定義注解及AOP的開發(fā)和使用詳解
在公司項(xiàng)目中,如果需要做一些公共的功能,如日志等,最好的方式是使用自定義注解,自定義注解可以實(shí)現(xiàn)我們對想要添加日志的方法上添加,這篇文章基于日志功能來講講自定義注解應(yīng)該如何開發(fā)和使用,需要的朋友可以參考下2023-08-08解決springboot mapper注入報(bào)紅問題
這篇文章主要介紹了解決springboot mapper注入報(bào)紅問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11詳解JDBC的概念及獲取數(shù)據(jù)庫連接的5種方式
Java?DataBase?Connectivity是將Java與SQL結(jié)合且獨(dú)立于特定的數(shù)據(jù)庫系統(tǒng)的應(yīng)用程序編程接口,一種可用于執(zhí)行SQL語句的JavaAPI。本文主要介紹了JDBC的概念及獲取數(shù)據(jù)庫連接的5種方式,需要的可以參考一下2022-09-09java讀取resources文件詳解及實(shí)現(xiàn)代碼
這篇文章主要介紹了java讀取resources文件詳解及實(shí)現(xiàn)代碼的相關(guān)資料,在開發(fā)項(xiàng)目的時(shí)候經(jīng)常會遇到讀取文件夾里面的內(nèi)容,需要的朋友可以參考下2017-07-07