首頁 > 軟體

mybatis條件構造器(EntityWrapper)的使用方式

2022-03-22 13:00:20

mybatis條件構造器(EntityWrapper)使用

基本的 CRUD 操作,我們僅僅需要繼承一個 BaseMapper 即可實現大部分單表 CRUD 操作。BaseMapper 提供了多達 17 個方法供使用, 可以極其方便的實現單一、批次、分頁等操作,極大的減少開發負擔。

但是mybatis-plus的強大不限於此,請看如下需求該如何處理:

需求

我們需要分頁查詢 tb_employee 表中,年齡在 18~50 之間性別為男且姓名為 xx 的所有使用者,這時候我們該如何實現上述需求呢?

使用MyBatis : 需要在 SQL 對映檔案中編寫帶條件查詢的 SQL,並用PageHelper 外掛完成分頁. 實現以上一個簡單的需求,往往需要我們做很多重複單調的工作。

使用MP: 依舊不用編寫 SQL 語句,MP 提供了功能強大的條件構造器 ------ EntityWrapper。

直接看幾個案例體會EntityWrapper的使用

1、分頁查詢年齡在18 - 50且gender為0、姓名為tom的使用者:

List<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(1,3),
     new EntityWrapper<Employee>()
        .between("age",18,50)
        .eq("gender",0)
        .eq("last_name","tom")
);

注:由此案例可知,分頁查詢和之前一樣,new 一個page物件傳入分頁資訊即可。至於分頁條件,new 一個EntityWrapper物件,呼叫該物件的相關方法即可。between方法三個引數,分別是column、value1、value2,該方法表示column的值要在value1和value2之間;eq是equals的簡寫,該方法兩個引數,column和value,表示column的值和value要相等。注意column是資料表對應的欄位,而非實體類屬性欄位。

2、查詢gender為0且名字中帶有老師、或者郵箱中帶有a的使用者:

List<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
               .eq("gender",0)
               .like("last_name","老師")
                //.or()//和or new 區別不大
               .orNew()
               .like("email","a")
);

注:未說分頁查詢,所以用selectList即可,用EntityWrapper的like方法進行模糊查詢,like方法就是指column的值包含value值,此處like方法就是查詢last_name中包含“老師”字樣的記錄;“或者”用or或者orNew方法表示,這兩個方法區別不大,用哪個都可以,可以通過控制檯的sql語句自行感受其區別。

3、查詢gender為0,根據age排序,簡單分頁:

List<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
                .eq("gender",0)
                .orderBy("age")//直接orderby 是升序,asc
                .last("desc limit 1,3")//在sql語句後面追加last裡面的內容(改為降序,同時分頁)
);

注:簡單分頁是指不用page物件進行分頁。orderBy方法就是根據傳入的column進行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是將last方法裡面的value值追加到sql語句的後面,在該案例中,最後的sql語句就變為select ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以進行降序排序和分頁。

4、分頁查詢年齡在18 - 50且gender為0、姓名為tom的使用者:

條件構造器除了EntityWrapper,還有Condition。用Condition來處理一下這個需求:

 List<Employee> employees = emplopyeeDao.selectPage(
                new Page<Employee>(1,2),
                Condition.create()
                        .between("age",18,50)
                        .eq("gender","0")
 );

注:Condition和EntityWrapper的區別就是,建立條件構造器時,EntityWrapper是new出來的,而Condition是調create方法建立出來。

5、根據條件更新:

@Test
public void testEntityWrapperUpdate(){
        Employee employee = new Employee();
        employee.setLastName("蒼老師");
        employee.setEmail("cjk@sina.com");
        employee.setGender(0);
        emplopyeeDao.update(employee,
                new EntityWrapper<Employee>()
                .eq("last_name","tom")
                .eq("age",25)
        );
}

注:該案例表示把last_name為tom,age為25的所有使用者的資訊更新為employee中設定的資訊。

6、根據條件刪除:

emplopyeeDao.delete(
        new EntityWrapper<Employee>()
        .eq("last_name","tom")
        .eq("age",16)
);

注:該案例表示把last_name為tom、age為16的所有使用者刪除

Wrappers使用的坑點

假設param物件中存在一個list集合,如果list集合不為空是時,取list集合最後一條的資料作為條件

public void test(Param param){
    LambdaQueryWrapper<TeacherModel> wrapper = Wrappers.lambdaQuery();
    wrapper.eq(collUtil.isNotEmpty(param.getList()), Entity::condition, param.getList().get(param.getList().size() - 1); // 編譯通過,執行時,如果param中的list為null,則報null pointer異常,這是因為mp在拼接條件時,會將三個引數帶入到eq方法,因此param.getList()為null時,param.getList().get(param.getList().size() - 1) 變成了 null..get(param.getList().size() - 1),所以導致了空指標
    list(wrapper);
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com