Mybatis-Plus Wrapper條件構(gòu)造器超詳細(xì)使用教程
Wrapper條件構(gòu)造器
條件構(gòu)造器wrapper就是用來封裝CRUD方法參數(shù)條件的一個(gè)接口,其底層有很多的子類,最主要的就是最下面的四個(gè)子類:
- queryWrapper可以用來刪改查
- updateWrapper可以在修改操作時(shí)不必創(chuàng)建實(shí)體類對象的操作
- LambdaQueryWrapper和LambdaUpdateWrapper則是在字段參數(shù)的調(diào)用上進(jìn)行了升級,其他都一樣
因?yàn)樵鰟h改查中的增加記錄不需要條件即可完成,所以增加方法無需條件構(gòu)造器wrapper,其他的刪改查則是有這個(gè)條件構(gòu)造器參數(shù)的
1 queryWrapper構(gòu)造器
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的區(qū)別在于:selectMaps會(huì)將查詢到的結(jié)果封裝在一個(gè)元素類型為map集合的list集合中,集合中只有查詢返回字段所對應(yīng)的鍵值對;而selectList的返回值也是一個(gè)list集合,只不過元素類型為對應(yīng)的泛型,包含泛型所有的字段,查詢返回字段之外的值都為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("刪除的行數(shù)為" + 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("修改的行數(shù)為" + result); }
1.2 條件優(yōu)先級
??使用queryWrapper組裝復(fù)雜條件的時(shí)候,存在一個(gè)且或條件的優(yōu)先級問題,也就是說在實(shí)現(xiàn)多條件拼接的時(shí)候且或條件該如何拼接到一起,接下來就挑取兩個(gè)例子來了解一下
// (年齡大于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"));
??總結(jié)一下:Lambda表達(dá)式中的條件會(huì)被當(dāng)做一個(gè)整體優(yōu)先執(zhí)行,如果不括起來影響結(jié)果的話就需要使用Lambda表達(dá)式的寫法,具體的使用要根據(jù)業(yè)務(wù)SQL語句來定
1.3 實(shí)現(xiàn)子查詢
@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構(gòu)造器
2.1 升級修改方法(無需創(chuàng)建對象)
組裝修改條件 修改條件:用戶名中包含有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("修改的行數(shù)為" + result); }
由SQL可見,使用updateWrapper和queryWrapper完成的修改功能一樣,且調(diào)用的方法也一樣(mapper.update),二者的區(qū)別就是updateWrapper不用創(chuàng)建實(shí)體類對象,直接使用set方法就可以設(shè)置修改的字段值
2.2 實(shí)際開發(fā)時(shí)的應(yīng)用
??在實(shí)際開發(fā)中,不管是queryWrapper還是updateWrapper都應(yīng)該在一定的判斷下再去使用條件構(gòu)造器拼接條件,比如說請求傳過來的值在不為空的情況下才去對這個(gè)字段進(jìn)行條件設(shè)置,比如下面的這段代碼
@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判斷顯得過于冗余,于是許多的方法都帶有一個(gè)condition參數(shù),當(dāng)這個(gè)參數(shù)為true的時(shí)候才會(huì)拼接查詢條件,下面的代碼用來代替上面一堆的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構(gòu)造器
??lambdaXxxWrapper與xxxWrapper的區(qū)別就是:他們可以使用Lambda的方式直接調(diào)用對象的getter方法來指定字段,而不用對照數(shù)據(jù)庫中的字段名,這樣就樂意避免參數(shù)對應(yīng)不上數(shù)據(jù)庫字段的問題。除了在調(diào)用字段時(shí)的寫法不一樣之外,其他的寫法上二者的方式都一樣
3.1 lambdaQueryWrapper構(gòu)造器
@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構(gòu)造器
@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("修改的行數(shù)為" + result); }
到此這篇關(guān)于Mybatis-Plus Wrapper條件構(gòu)造器超詳細(xì)使用教程的文章就介紹到這了,更多相關(guān)Mybatis-Plus Wrapper條件構(gòu)造器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mybatis-plus?Wrapper條件構(gòu)造器updateForSet更新方式
- Mybatis-Plus 條件構(gòu)造器 QueryWrapper 的基本用法
- 詳解MyBatis-Plus Wrapper條件構(gòu)造器查詢大全
- Mybatis-Plus 條件構(gòu)造器示例詳解
- Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式
- mybatis-plus條件構(gòu)造器的操作代碼
- MyBatis-Plus條件構(gòu)造器之condition參數(shù)的使用
- Mybatis-Plus條件構(gòu)造器的具體使用方法
- MyBatis-Plus條件構(gòu)造器Wrapper應(yīng)用實(shí)例
相關(guān)文章
SpringBoot整合RabbitMQ, 實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者的功能
這篇文章主要介紹了SpringBoot整合RabbitMQ, 實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者的功能,幫助大家更好得理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下2021-03-03JavaWeb如何實(shí)現(xiàn)統(tǒng)一查詢接口(jfinal)
這篇文章主要介紹了JavaWeb如何實(shí)現(xiàn)統(tǒng)一查詢接口(jfinal),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過程圖解
這篇文章主要介紹了Java上傳文件到服務(wù)器指定文件夾實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08詳解Java多線程編程中線程的啟動(dòng)、中斷或終止操作
在Java中start和tun方法可用被用來啟動(dòng)線程,而用interrupt方法來中斷或終止線程,以下我們就來詳解Java多線程編程中線程的啟動(dòng)、中斷或終止操作2016-07-07使用Java 8 Lambda表達(dá)式將實(shí)體映射到DTO的操作
這篇文章主要介紹了使用Java 8 Lambda表達(dá)式將實(shí)體映射到DTO的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Java中MyBatis Plus知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理一篇關(guān)于Java中MyBatis Plus知識(shí)點(diǎn)總結(jié),需要的朋友們參考下。2019-10-10SpringBoot集成單點(diǎn)登錄CAS的方法實(shí)現(xiàn)
本文主要介紹了SpringBoot集成單點(diǎn)登錄CAS的方法實(shí)現(xiàn),包括CAS的基本概念、集成步驟、具體代碼示例等,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03