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。

推薦閱讀: