MyBatisPlus-QueryWrapper多條件查詢及修改方式
gt、ge、lt、le、isNull、isNotNull
大于 >
例: gt("age", 18) → age > 18
ge 大于等于 >=
例: ge("age", 18) → age >= 18
lt 小于 <
例: lt("age", 18) → age < 18
le 小于等于 <=
例: le("age", 18) → age <= 18
isNUll 字段 IS NULL
例: isNull("name") → name is null
isNotNull 字段 IS NOT NULL
例: isNotNull("name") → name is not null
@Test public void queryWrapperOne() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper. isNull("name") .ge("age", 23) .isNotNull("email"); // 邏輯刪除 int result = userMapper.delete(queryWrapper); System.out.println(result); // 最終的語(yǔ)句為:UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL }
eq、ne
eq 等于 =
例: eq("name", "老王") → name = '老王'
ne 不等于 <>
例: ne("name", "老王") → name <> '老王'
@Test public void queryWrapperTwo() { ? ? QueryWrapper<User> queryWrapper = new QueryWrapper<>(); ? ? queryWrapper.eq("name", "BNTang"); ? ? // selectOne:返回的是一條記錄,當(dāng)出現(xiàn)多條時(shí)會(huì)報(bào)錯(cuò) ? ? User user = userMapper.selectOne(queryWrapper); ? ? System.out.println(user); }
between、notBetween
BETWEEN 值1 AND 值2
例: between("age", 18, 30) → age between 18 and 30
NOT BETWEEN 值1 AND 值2
例: notBetween("age", 18, 30) → age not between 18 and 30
allEq
allEq 全部 eq(或個(gè)別 isNull)
個(gè)別參數(shù)說(shuō)明:
params: key 為數(shù)據(jù)庫(kù)字段名, value 為字段值
如果想表示 null isNull,則在 value 取值的時(shí)候傳入一個(gè) null, 為 null 時(shí)調(diào)用 isNull 方法, 為false時(shí)則忽略value為null的,也就是不拼接 value 為 null 的查詢條件字段
例1: allEq({id:1,name:"老王",age:null})→id = 1 and name = '老王' and age is null
例2: allEq({id:1,name:"老王",age:null}, false)→id = 1 and name = '老王'
@Test public void queryWrapperFour() { ? ? QueryWrapper<User> queryWrapper = new QueryWrapper<>(); ? ? Map<String, Object> queryParamsMap = new HashMap<>(); ? ? queryParamsMap.put("id", 1373266771933462530L); ? ? queryParamsMap.put("name", "BNTang"); ? ? queryParamsMap.put("age", 23); ? ? queryWrapper.allEq(queryParamsMap); ? ? List<User> users = userMapper.selectList(queryWrapper); ? ? users.forEach(System.out::println); }
個(gè)別參數(shù)說(shuō)明
filter: 過(guò)濾函數(shù), 是否允許字段傳入比對(duì)條件中
params 與 null、IsNull 同上
例1: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})→name = '老王' and age is null
例2: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)→name = '老王'
如上圖可看到,只添加了一個(gè) id 查詢的條件因?yàn)槲覍?xiě)的過(guò)濾條件為要包含 i 這個(gè)字符串,所以只有第一個(gè) key, value 包含了所以就只添加了 id
like、notLike、likeLeft、likeRight
LIKE '%值%'
例: like("name", "王")→name like '%王%'
NOT LIKE '%值%'
例: notLike("name", "王")→name not like '%王%'
LIKE '%值'
例: likeLeft("name", "王")→name like '%王'
LIKE '值%'
例: likeRight("name", "王")→name like '王%'
@Test public void queryWrapperFive() { ? ? QueryWrapper<User> queryWrapper = new QueryWrapper<>(); ? ? queryWrapper ? ? ? ? ? ? .notLike("name", "BNTang") ? ? ? ? ? ? .likeRight("email", "zq"); ? ? // 返回值是Map列表 ? ? List<Map<String, Object>> users = userMapper.selectMaps(queryWrapper); ? ? users.forEach(System.out::println); }
in、notIn、inSql、notinSql、exists、notExists
字段 IN (value.get(0), value.get(1), ...)
例: in("age",{1,2,3})→age in (1,2,3)
字段 NOT IN (value.get(0), value.get(1), ...)
例: notIn("age",{1,2,3})→age not in (1,2,3)
字段 IN ( sql語(yǔ)句 )
例: inSql("age", "1,2,3,4,5,6")→age in (1,2,3,4,5,6)
例: inSql("id", "select id from table where id < 3")→id in (select id from table where id < 3)
字段 NOT IN ( sql語(yǔ)句 )
例: notInSql("age", "1,2,3,4,5,6")→age not in (1,2,3,4,5,6)
例: notInSql("id", "select id from table where id < 3")→id not in (select id from table where id < 3)
拼接 EXISTS ( sql語(yǔ)句 )
例: exists("select id from table where age = 1")→exists (select id from table where age = 1)
拼接 NOT EXISTS ( sql語(yǔ)句 )
例: notExists("select id from table where age = 1")→not exists (select id from table where age = 1)
@Test public void queryWrapperSix() { ? ?QueryWrapper<User> queryWrapper = new QueryWrapper<>(); ? ? queryWrapper.in("id", 1, 2, 3); ? ? queryWrapper.inSql("id", "select id from user where id < 3"); ? ? // 返回值是Object列表 ? ? List<Object> users = userMapper.selectObjs(queryWrapper); ? ? users.forEach(System.out::println); }
or、and
拼接 OR
注意事項(xiàng):
主動(dòng)調(diào)用or表示緊接著下一個(gè)方法不是用and連接!(不調(diào)用or則默認(rèn)為使用and連接)
例: eq("id",1).or().eq("name","老王")→id = 1 or name = '老王'
OR 嵌套
例: or(i -> i.eq("name", "李白").ne("status", "活著"))→or (name = '李白' and status <> '活著')
AND 嵌套
例: and(i -> i.eq("name", "李白").ne("status", "活著"))→and (name = '李白' and status <> '活著')
@Test public void queryWrapperSeven() { ? ? // 修改值 ? ? User user = new User(); ? ? user.setAge(99); ? ? user.setName("BNTang6666"); ? ? // 修改條件 ? ? UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>(); ? ? userUpdateWrapper ? ? ? ? ? ? .like("name", "BNTang") ? ? ? ? ? ? .or() ? ? ? ? ? ? .between("age", 20, 30); ? ? int result = userMapper.update(user, userUpdateWrapper); ? ? System.out.println(result); }
嵌套 or、嵌套 and
@Test public void queryWrapperEight() { // 修改值 User user = new User(); user.setAge(99); user.setName("BNTang6666"); // 修改條件 UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>(); userUpdateWrapper .like("name", "A") .or(i -> i.eq("name", "BNTang6666").ne("age", 20)); int result = userMapper.update(user, userUpdateWrapper); System.out.println(result); }
orderBy、orderByDesc、orderByAsc
排序:ORDER BY 字段, ...
例: orderBy(true, true, "id", "name")→order by id ASC,name ASC
排序:ORDER BY 字段, ... DESC
例: orderByDesc("id", "name")→order by id DESC, name DESC
排序:ORDER BY 字段, ... ASC
例: orderByAsc("id", "name")→order by id ASC,name ASC
@Test public void queryWrapperNine() { ? ? QueryWrapper<User> queryWrapper = new QueryWrapper<>(); ? ? queryWrapper.orderByDesc("id"); ? ? List<User> users = userMapper.selectList(queryWrapper); ? ? users.forEach(System.out::println); }
last
無(wú)視優(yōu)化規(guī)則直接拼接到 sql 的最后
注意事項(xiàng):
只能調(diào)用一次, 多次調(diào)用以最后一次為準(zhǔn)有 sql 注入的風(fēng)險(xiǎn), 請(qǐng)謹(jǐn)慎使用
例: last("limit 1")
@Test public void queryWrapperTen() { ? ? QueryWrapper<User> queryWrapper = new QueryWrapper<>(); ? ? queryWrapper.last("limit 1"); ? ? List<User> users = userMapper.selectList(queryWrapper); ? ? users.forEach(System.out::println); }
指定要查詢的列
@Test public void queryWrapperEleven() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.select("id", "name", "age"); List<User> users = userMapper.selectList(queryWrapper); users.forEach(System.out::println); }
set、setSql
SQL SET 字段
例: set("name", "老李頭")
例: set("name", "")→數(shù)據(jù)庫(kù)字段值變?yōu)榭兆址?/p>
例: set("name", null)→據(jù)庫(kù)字段值變?yōu)閚ull
設(shè)置 SET 部分 SQL
例: setSql("name = '老李頭'")
@Test public void queryWrapperTwelve() { // 修改值 User user = new User(); user.setAge(10); // 修改條件 UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>(); userUpdateWrapper .like("name", "A") // 除了可以查詢還可以使用set設(shè)置修改的字段 .set("name", "BNTang") // 可以有子查詢 .setSql(" email = '303158131@qq.com'"); int result = userMapper.update(user, userUpdateWrapper); System.out.println(result); }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
搭建SpringBoot項(xiàng)目三種方式(圖文教程)
Springboot作為當(dāng)下最主流的java開(kāi)發(fā)框架,已成為IT從業(yè)人員的入門(mén)必備技能,本文主要介紹了搭建SpringBoot項(xiàng)目三種方式,感興趣的可以了解一下2023-09-09Java關(guān)鍵字final的實(shí)現(xiàn)原理分析
這篇文章主要介紹了Java關(guān)鍵字final的實(shí)現(xiàn)原理分析,在JDK8之前,如果在匿名內(nèi)部類中需要訪問(wèn)局部變量,那么這個(gè)局部變量一定是final修飾的,但final關(guān)鍵字可以省略,需要的朋友可以參考下2024-01-01SpringBoot中版本兼容性處理的實(shí)現(xiàn)示例
SpringBoot版本兼容性問(wèn)題通常是由于依賴庫(kù)與SpringBoot版本不兼容引起的,本文主要介紹了SpringBoot中版本兼容性處理的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07Spring MVC環(huán)境中文件上傳功能的實(shí)現(xiàn)方法詳解
文件上傳是大家應(yīng)該都不陌生的一個(gè)功能,最近在開(kāi)發(fā)中就又遇到了這個(gè)需求,所以想著總結(jié)一下方便以后需要的時(shí)候參考,下面這篇文章主要給大家介紹了關(guān)于Spring MVC環(huán)境中文件上傳功能的實(shí)現(xiàn)方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解
這篇文章主要介紹了Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段
這篇文章主要介紹了Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段,我們將重點(diǎn)關(guān)注兩種不同的方法,以展示框架的多功能性以及我們可以使用它的靈活方式。 需要的朋友可以參考下2019-05-05java自定義注解實(shí)現(xiàn)前后臺(tái)參數(shù)校驗(yàn)的實(shí)例
下面小編就為大家?guī)?lái)一篇java自定義注解實(shí)現(xiàn)前后臺(tái)參數(shù)校驗(yàn)的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11