首頁 > 軟體

Mybatis-Plus Wrapper條件構造器超詳細使用教學

2022-03-21 19:01:26

Wrapper條件構造器

條件構造器wrapper就是用來封裝CRUD方法引數條件的一個介面,其底層有很多的子類,最主要的就是最下面的四個子類:

  • queryWrapper可以用來刪改查
  • updateWrapper可以在修改操作時不必建立實體類物件的操作
  • LambdaQueryWrapper和LambdaUpdateWrapper則是在欄位引數的呼叫上進行了升級,其他都一樣

因為增刪改查中的增加記錄不需要條件即可完成,所以增加方法無需條件構造器wrapper,其他的刪改查則是有這個條件構造器引數的

1 queryWrapper構造器

1.1 組裝刪改查條件

組裝查詢條件

查詢條件為:名字裡包含a字母、年齡在20~30之間、email不為空的所有值,且查詢到的值按照年齡降序排序,若年齡相同則按照id升序排序

查詢返回name、age、email欄位

@Test
public void selectListTest() {
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.select("name", "age", "email")
   		  .like("name", "a")
           .between("age", 20, 30)
           .isNotNull("email")
           .orderByDesc("age")
           .orderByAsc("id");
   // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL) ORDER BY age DESC,id ASC
   List<Map<String, Object>> maps = mapper.selectMaps(queryWrapper);
   maps.forEach(System.out::println);
   System.out.println("========================================================================================");
   List<User> users = mapper.selectList(queryWrapper);
   users.forEach(System.out::println);
}

⚠  selectMaps和selectList的區別在於:selectMaps會將查詢到的結果封裝在一個元素型別為map集合的list集合中,集合中只有查詢返回欄位所對應的鍵值對;而selectList的返回值也是一個list集合,只不過元素型別為對應的泛型,包含泛型所有的欄位,查詢返回欄位之外的值都為null

組裝刪除條件

刪除條件:email不為空

@Test
public void deleteTest() {
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.isNull("email");
   // UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
   int result = mapper.delete(queryWrapper);
   System.out.println("刪除的行數為" + result);
}

組裝修改條件

修改條件:(年齡大於20並且使用者名稱中包含有a)或郵箱為null

@Test
public void updateTest() {
   User user = new User();
   user.setAge(20);
   user.setEmail("temporary.com");

   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.gt("age", 20)
           .like("name", "a")
           .or()
           .isNull("email");

   // UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
   int result = mapper.update(user, queryWrapper);
   System.out.println("修改的行數為" + result);
}

1.2 條件優先順序

  使用queryWrapper組裝複雜條件的時候,存在一個且或條件的優先順序問題,也就是說在實現多條件拼接的時候且或條件該如何拼接到一起,接下來就挑取兩個例子來了解一下

// (年齡大於20並且使用者名稱中包含有a) 或 郵箱為null
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
queryWrapper.gt("age", 20)
                .like("name", "a")
                .or()
                .isNull("email");

// 使用者名稱中包含有a 且 (年齡大於18或郵箱為null)
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
queryWrapper.like("name", "a")
                .and(i -> i.gt("age", 18).or().isNull("email"));

  總結一下:Lambda表示式中的條件會被當做一個整體優先執行,如果不括起來影響結果的話就需要使用Lambda表示式的寫法,具體的使用要根據業務SQL語句來定

1.3 實現子查詢

@Test
public void sonSelectTest() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id", "select id from user where id <= 100");

    // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id <= 100))
    List<User> users = mapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

2 updateWrapper構造器

2.1 升級修改方法(無需建立物件)

組裝修改條件 修改條件:使用者名稱中包含有a並且(年齡大於20或郵箱為null)

@Test
public void updateWrapperTest() {

   UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
   updateWrapper.like("name", "a")
           .and(i -> i.gt("age", 20).or().isNull("email"));
   updateWrapper.set("name", "小黑").set("email", "dhsjfghr");

   // UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
   int result = mapper.update(null, updateWrapper);
   System.out.println("修改的行數為" + result);
}

由SQL可見,使用updateWrapper和queryWrapper完成的修改功能一樣,且呼叫的方法也一樣(mapper.update),二者的區別就是updateWrapper不用建立實體類物件,直接使用set方法就可以設定修改的欄位值

2.2 實際開發時的應用

  在實際開發中,不管是queryWrapper還是updateWrapper都應該在一定的判斷下再去使用條件構造器拼接條件,比如說請求傳過來的值在不為空的情況下才去對這個欄位進行條件設定,比如下面的這段程式碼

@Test
public void ifTest() {

    String userName = "";
    Integer ageBegin = 20;
    Integer ageEnd = 30;

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();

    if (StringUtils.isNotBlank(userName)) {
        queryWrapper.like("name", userName);
    }
    if (ageBegin != null) {
        queryWrapper.ge("age", ageBegin);
    }
    if (ageEnd != null) {
        queryWrapper.le("age", ageEnd);
    }

    List<User> users = mapper.selectList(queryWrapper);
}

  然而,上面的程式碼使用了很多的if判斷顯得過於冗餘,於是許多的方法都帶有一個condition引數,當這個引數為true的時候才會拼接查詢條件,下面的程式碼用來代替上面一堆的if判斷

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(userName), "name", userName)
        .ge(ageBegin != null, "age", ageBegin)
        .le(ageEnd != null, "age", ageEnd);

3 lambdaXxxWrapper構造器

  lambdaXxxWrapper與xxxWrapper的區別就是:他們可以使用Lambda的方式直接呼叫物件的getter方法來指定欄位,而不用對照資料庫中的欄位名,這樣就樂意避免引數對應不上資料庫欄位的問題。除了在呼叫欄位時的寫法不一樣之外,其他的寫法上二者的方式都一樣

3.1 lambdaQueryWrapper構造器

@Test
public void lambdaQueryWrapperTest() {

    String userName = "";
    Integer ageBegin = 20;
    Integer ageEnd = 30;

    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(StringUtils.isNotBlank(userName), User::getName, userName)
            .ge(ageBegin != null, User::getAge, ageBegin)
            .le(ageEnd != null, User::getAge, ageEnd);

    List<User> users = mapper.selectList(lambdaQueryWrapper);
}

3.2 lambdaUpdateWrapper構造器

@Test
public void lambdaUpdateWrapperTest() {

    LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper.like(User::getName, "a")
            .and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));
    lambdaUpdateWrapper.set(User::getName, "小黑").set(User::getEmail, "dhsjfghr");

    // UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
    int result = mapper.update(null, lambdaUpdateWrapper);
    System.out.println("修改的行數為" + result);
}

到此這篇關於Mybatis-Plus Wrapper條件構造器超詳細使用教學的文章就介紹到這了,更多相關Mybatis-Plus Wrapper條件構造器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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