mybatis?plus實現(xiàn)條件查詢
一、wapper介紹
用mp也可以方便的實現(xiàn)稍復雜點的條件查詢,當然了很復雜的就還是要xml編寫sql了。
先看下mp的條件構(gòu)造抽象類的結(jié)構(gòu):

Wrapper: 條件構(gòu)造抽象類,最頂端父類
AbstractWrapper: 用于查詢條件封裝,生成 sql 的 where 條件
QueryWrapper: Entity 對象封裝操作類,不是用lambda語法
UpdateWrapper: Update 條件封裝,用于Entity對象更新操作
AbstractLambdaWrapper: Lambda 語法使用 Wrapper統(tǒng)一處理解析lambda獲取數(shù)據(jù)庫字段
LambdaQueryWrapper: 用于Lambda語法使用的查詢Wrapper
LambdaUpdateWrapper: Lambda 更新封裝Wrapper
不過最常用的還是QueryWrapper、UpdateWrapper等這些。
套路還是那樣,先創(chuàng)建QueryWrapper對象,然后再調(diào)用各種方法。
// 測試條件查詢
@Test
void testQueryWrapper() {
//創(chuàng)建對象,泛型里加上實體對象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
// 設(shè)置查詢的條件
// ge表示 >= , 這里就是查詢age字段,大于40的數(shù)據(jù)
wrapperUser.ge("age", 40);
// 調(diào)用查詢方法中,傳入wrapper對象
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users);
}
這里就會查詢表里age>=40,的數(shù)據(jù),看下執(zhí)行過程的sql語句:

二、常用的條件方法
在構(gòu)造條件的時候,除了上面的ge,還有很多其他的方法,這里簡單介紹下比較常用的,并且貼出執(zhí)行的sql。
1. gt 表示 >
... ...
// gt表示 > , 這里就是查詢age字段,大于40的數(shù)據(jù)
wrapperUser.gt("age", 40);
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age > ? ==> Parameters: 40(Integer)
2. le 表示 <=
... ...
// le表示 <=, 這里就是查詢age字段,小于等于40的數(shù)據(jù)
wrapperUser.le("age", 40);
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age <= ? ==> Parameters: 40(Integer)
3. lt 表示 <
... ...
// lt表示 <, 這里就是查詢age字段,小于40的數(shù)據(jù)
wrapperUser.lt("age", 40);
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age < ? ==> Parameters: 40(Integer)
4. isNull 表示 查詢值為null
... ...
// isNull
wrapperUser.isNull("name");
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name IS NULL ==> Parameters: <== Total: 0
5. isNotNull 表示 查詢值為不為null
... ...
// isNotNull
wrapperUser.isNotNull("name");
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name IS NOT NULL ==> Parameters:
6. eq 表示 =
... ...
// eq
wrapperUser.eq("name", "大周4");
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name = ? ==> Parameters: 大周4(String)
7. ne 表示 !=
... ...
// eq
wrapperUser.ne("name", "大周4");
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name <> ? ==> Parameters: 大周4(String)
8. between 表示 在范圍之間,包含邊界值
... ...
// between
wrapperUser.between("age", 40, 50);
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age BETWEEN ? AND ? ==> Parameters: 40(Integer), 50(Integer)
9. notBetween 表示 在范圍之外,不含邊界值
... ...
// between
wrapperUser.notBetween("age", 40, 50);
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age NOT BETWEEN ? AND ? ==> Parameters: 40(Integer), 50(Integer)
10. notBetween 表示 在范圍之外,不含邊界值
... ...
// between
wrapperUser.notBetween("age", 40, 50);
... ...
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age NOT BETWEEN ? AND ? ==> Parameters: 40(Integer), 50(Integer)
11. allEq 多條件查詢
如果我where后面要加多個條件,可以使用allEq。先創(chuàng)建一個hashmap,然后把多個條件put進去,再調(diào)用allEq即可。
@Test
void testQueryWrapper() {
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
Map<String, Object> map = new HashMap<>();
map.put("id", 5);
map.put("name", "wesson5");
map.put("age", 29);
wrapperUser.allEq(map);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users);
}
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ? ==> Parameters: wesson5(String), 5(Integer), 29(Integer)
12. .鏈式編程,多條件查詢
此外,還可以使用鏈式編程,直接在后面繼續(xù).調(diào)用別的方法。
@Test
void testQueryWrapper() {
//創(chuàng)建對象,泛型里加上實體對象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.eq("age", 29)
.eq("name", "wesson5")
.eq("id", 5);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users);
}
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age = ? AND name = ? AND id = ? ==> Parameters: 29(Integer), wesson5(String), 5(Integer)
13. or、and
默認情況下,在不調(diào)撥or()方法的情況下,是使用and()。
@Test
void testQueryWrapper() {
//創(chuàng)建對象,泛型里加上實體對象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.eq("age", 29)
.or()
.eq("name", "wesson5")
.or()
.eq("id", 5);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users);
}
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age = ? OR name = ? OR id = ? ==> Parameters: 29(Integer), wesson5(String), 5(Integer)
14. 嵌套or、嵌套and
查詢sql經(jīng)常會有嵌套or或者and的情況,可以這樣寫:
@Test
void testQueryWrapper() {
//創(chuàng)建對象,泛型里加上實體對象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.eq("age", 29)
.or(
i -> i.eq("name", "wesson5")
.or()
.eq("id", 5)
);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users);
}
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND age = ? OR ( name = ? OR id = ? ) ==> Parameters: 29(Integer), wesson5(String), 5(Integer)
15. in、notIn
等于sql里的 in和not in。
@Test
void testQueryWrapper() {
//創(chuàng)建對象,泛型里加上實體對象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.in("id", 1, 2, 3);
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users);
}
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND id IN (?,?,?) ==> Parameters: 1(Integer), 2(Integer), 3(Integer)
16. inSql、notinSql
inSql、notinSql可以用來子查詢,比如 where id in (select * ... ...)
@Test
void testQueryWrapper() {
//創(chuàng)建對象,泛型里加上實體對象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.in("id", "select id from user where id < 5");
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users);
}
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND id IN (?) ==> Parameters: select id from user where id < '5'(String)
17. last
last可以直接拼接sql到最后,只能調(diào)用一次,多次調(diào)用以最后一次為準。
注意:有sql注入的風險,慎用。
@Test
void testQueryWrapper() {
//創(chuàng)建對象,泛型里加上實體對象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.last("limit 1");
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users);
}
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 limit 1 ==> Parameters:
18. 指定要查詢的列
只查詢出指定的字段,比如"id", "name", "age"。
@Test
void testQueryWrapper() {
//創(chuàng)建對象,泛型里加上實體對象
QueryWrapper<User> wrapperUser = new QueryWrapper<>();
wrapperUser.select("id", "name", "age");
List<User> users = userMapper.selectList(wrapperUser);
System.out.println(users);
}
mp執(zhí)行的sql:
==> Preparing: SELECT id,name,age FROM user WHERE deleted=0 ==> Parameters:
以上是一些在業(yè)務(wù)開發(fā)中常用的,稍復雜些的條件查詢,實際情況可能還有其他組合變化,更多關(guān)于mybatis plus條件查詢的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決IDEA創(chuàng)建SpringBoot項目沒有Java版本8問題
這篇文章主要介紹了解決IDEA創(chuàng)建SpringBoot項目沒有Java版本8問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
cookie+mybatis+servlet實現(xiàn)免登錄時長兩天半的整體流程
這篇文章主要介紹了cookie+mybatis+servlet實現(xiàn)免登錄時長兩天半,主要用到的技術(shù)有session、cookie、轉(zhuǎn)發(fā)、重定向、filter、和servlet,最重要的還是具體的來運用它們在前端頁面真正的搭建出一個應(yīng)用,通過這個練習,對我們所學的web知識做一個整合,需要的朋友可以參考下2022-10-10
java使用EasyExcel導出上萬數(shù)據(jù)如何避免OOM
本文主要介紹了使用EasyExcel導出大量數(shù)據(jù)時避免OOM問題的方法,通過分頁查詢和分批次寫入Excel,可以有效避免內(nèi)存溢出,并提供了一個封裝好的工具類,簡化了導出代碼的編寫2024-11-11
java多線程開發(fā)之通過對戰(zhàn)游戲?qū)W習CyclicBarrier
這篇文章給大家分享了關(guān)于java多線程開發(fā)中通過對戰(zhàn)游戲?qū)W習CyclicBarrier的相關(guān)知識點內(nèi)容,有興趣的朋友們學習參考下。2018-08-08
解決window.location.href之后session丟失的問題
今天小編就為大家分享一篇關(guān)于解決window.location.href之后session丟失的問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
JavaEE開發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳
本篇文章主要介紹了SpringMVC的相關(guān)知識。同時也會介紹到j(luò)s、css這些靜態(tài)文件的加載配置,以及服務(wù)器推送的兩種實現(xiàn)方式并且給出了兩者的區(qū)別。下面跟著小編一起來看下吧2017-04-04

