MybatisPlus之likeRight的用法
關於likeRight的用法
在使用Mybatis-plus的時候,使用like方法發現匹配的方法和自己想的相反,特此記錄下:
使用場景:
我想要查詢分類的某一層級下的訂單,如下圖,我想查詢所有“男裝”訂單
那麼,如果是寫SQL查詢就是這樣
select xx,xx from order_info where category_id like '10,20%';
可是,項目如果使用的是Mybatis-plus,那麼我們該怎麼寫呢?
最開始我想的是,likeLeft就是左匹配嘛,就按照下面這麼寫:
this.list(Wrappers.<OrderInfo>lambdaQuery().likeLeft(OrderInfo::getCategoryId,orderQueryReq.getCategoryId()).eq(OrderInfo::getStatus,99));
哦豁,沒查到數據。然後就換成likeRight之後,bingo 數據出來瞭:
然後,我就默默的去看瞭下源碼(從上到下,層層遞進,直到最後我們找到瞭轉換SQL的地方,對!就是那個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就是‘%’這個玩意兒加在左側,likeRight就是加在右側,默認就是兩邊都加,也就是like!!!
使用like與likeright方法查詢信息的踩坑
先說結論,like 和 likeRight的區別就是
like
:填入query的參數兩端加上通配符,會進行左右兩端進行like匹配likeRight
:隻給填入參數的右端加入通配符進行匹配。
所以使用的時候要搞清楚自己的需求,盲目使用like查詢會造成隱患。
案例
想要抽取 一串數字第7和8位組成是03的數據。
例子
2022010101
2022010203
2022010302
2022020102
2022020204
2022020301
結果應該是第3個和第6個。
然後我的like語句是
like("number", "______" + 03 + "%") //下劃線_ 代表占位符,表示這個位置的數字隨意,但是一個占位符表示隻能有一個字符,意思表示為:前面6位數字隨意。但第7,8位必須要03.
然而結果是第2,3,6個,這個結果導致我一系列操作直接全部迷惑操作,把數據全大變樣。
最後知道原因,原來mybatisplus的like方法,會在執行sql的時候給參數前後都加上%,這就導致我的6個下劃線失效, 所以數據混亂。
然後我換成likeRight就結果問題瞭,在找bug的時候,我從前端找到後端,從頁面找到請求,再檢查有沒有寫錯,最後發現,數據庫這裡出錯瞭,費瞭好大勁,太難瞭。
以後用like查詢的時候可要用對瞭,還是沒有系統的學習mybatisplus,基礎不好所導致的問題。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Mybatis plus中的like查詢問題
- Go語言學習之Switch語句的使用
- MyBatis-Plus allEq()的用法詳解
- SpringBoot+MyBatisPlus+MySQL8實現樹形結構查詢
- Mybatis-Plus中update()和updateById()將字段更新為null