寫在前面
🛫更多知識總結見Mybatis-Plus專欄
🚕內容總結自尚硅谷楊博超老師的視頻
🚒博主對于該知識尚在學習階段
🚄如果發現存在問題請毫不吝嗇的指出
🚀🚀扎哇太棗糕的博客首頁🚀🚀
文章目錄
- 1 queryWrapper構造器
- 1.1 組裝刪改查條件
- 1.2 條件優先級
- 1.3 實現子查詢
- 2 updateWrapper構造器
- 2.1 升級修改方法(無需創建對象)
- 2.2 實際開發時的應用
- 3 lambdaXxxWrapper構造器
- 3.1 lambdaQueryWrapper構造器
- 3.2 lambdaUpdateWrapper構造器
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 ASCList<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);
}
這篇博客參加了幾何大佬的社區活動
還望大家多多支持幾何大佬的社區
??????????????????
CSDN社區 《創作達人》活動,只要參與其中并創作文章就有機會獲得官方獎品:精品日歷、新程序員雜志,快來參與吧!鏈接直達 https://bbs.csdn.net/topics/605272551