Mybatis-plus動態(tài)條件查詢QueryWrapper的使用案例
一、queryWrapper介紹
queryWrapper是mybatis plus中實現(xiàn)查詢的對象封裝操作類,可以封裝sql對象,包括where條件,order by排序,select哪些字段等等,他的層級關(guān)系如下:

Wrapper:條件構(gòu)造抽象類,最頂端父類;
AbstractWrapper:用于查詢條件封裝,生成sql的where條件;
AbstractLambdaWrapper:Lambda語法使用Wrapper統(tǒng)一處理解析lambda獲取column。
LambdaQueryWrapper:用于lambda語法使用的查詢Wrapper;
LambdaUpdateWrapper:Lambda更新封裝Wrapper;
QueryWrapper:Entity對象封裝操作類,不是用lambda;
UpdateWrapper:Update條件封裝,用于Entity對象更新操作。
二、環(huán)境搭建
1.創(chuàng)建數(shù)據(jù)庫表并添加幾條數(shù)據(jù):
CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶id', `name` varchar(255) DEFAULT NULL COMMENT '用戶姓名', `age` int(2) DEFAULT NULL COMMENT '用戶年齡', `email` varchar(255) DEFAULT NULL COMMENT '郵箱', `del_flag` int(1) DEFAULT '0' COMMENT '刪除標識 0:正常 1:刪除 默認0', `create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時間', `update_time` datetime DEFAULT NULL COMMENT '更新時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='用戶表';
數(shù)據(jù)如下:

2.創(chuàng)建Springboot項目
創(chuàng)建Springboot項目,集成mybatis-plus、web、mysql等相關(guān)依賴;搭建基礎(chǔ)的demo操作:
(1)pom.xml:
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--mybatis-plus自動的維護了mybatis以及mybatis-spring的依賴,
在springboot中這三者不能同時的出現(xiàn),避免版本的沖突,表示:跳進過這個坑-->
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--mysql驅(qū)動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- alibaba的druid數(shù)據(jù)庫連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<!-- alibaba的druid數(shù)據(jù)庫連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--工具類-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
(2)配置application.yml
# 服務(wù)端口
server:
port: 8083
# 數(shù)據(jù)源配置
spring:
datasource:
name: test
url: jdbc:mysql://localhost:3306/db_order?&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSl=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
## 配置連接池信息
## 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 30
## 配置獲取連接等待超時的時間
maxWait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻
filters: stat,wall
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 超過時間限制是否回收
removeAbandoned: true
# 超時時間;單位為秒。180秒=3分鐘
removeAbandonedTimeout: 180
# 關(guān)閉abanded連接時輸出錯誤日志
logAbandoned: true
# mybatis-plus 默認掃描mapper.xml的目錄
mybatis-plus:
mapper-locations: classpath*:/mapper/*.xml
#配置sql打印日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl(3)創(chuàng)建一個實體類:
/**
* @author qzz
*/
@Data
@TableName("t_user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用戶id
*/
@TableId(value="id", type = IdType.AUTO)
private Integer id;
/**
* 名稱
*/
@TableField("name")
private String name;
/**
* 年齡
*/
@TableField("age")
private Integer age;
/**
* 刪除標識 0:正常 1:刪除 默認0
*/
@TableField("del_flag")
private Integer del_flag;
/**
* 郵箱
*/
@TableField("email")
private String email;
/**
* 創(chuàng)建時間
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date create_time;
/**
* 修改時間
*/
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date update_time;
}
(4)編寫一個mapper接口,只需繼承BaseMapper,基本的單表查詢都給你封裝好了。
/**
* @author qzz
*/
@Repository
public interface UserMapper extends BaseMapper<User> {
}三、queryWrapper示例
官網(wǎng)上可以看到有很多條件構(gòu)造器,下面將使用幾個常用的作為示例進行使用,其實本質(zhì)還是sql語句,如果想要打印sql日志,可以在application.yml文件中進行如下的配置:
mybatis-plus:
#配置sql打印日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

Wrapper是一個接口,官方提供了很多的實現(xiàn)類,我們通過其實現(xiàn)類去構(gòu)造wrapper對象即可。
1.案例一:根據(jù)name模糊查看未刪除的用戶列表信息
過濾條件:
- name 用戶名稱 ,模糊查看
- del_flag = 0
- 按照create_time創(chuàng)建時間降序
sql實現(xiàn):
select * from t_user
where del_flag = 0
<if test ="name!=null and ''!=name">
and name like concat('%',#{name},'%')
</if>
order by create_time descqueryWrapper實現(xiàn):
/**
* 案例一:根據(jù)name模糊查看未刪除的用戶列表信息
* @param name
* @return
*/
@RequestMapping("/list")
public Map<String,Object> getList(@RequestParam String name){
Map<String,Object> result = new HashMap<>();
//構(gòu)建一個查詢的wrapper
QueryWrapper<User> wrapper = new QueryWrapper<User>();
//name不為空時,組裝模糊查詢條件
wrapper.like(StringUtils.isNotBlank(name),"name",name);
//未刪除
wrapper.eq("del_flag",0);
//創(chuàng)建時間降序
wrapper.orderByDesc("create_time");
List<User> list = userMapper.selectList(wrapper);
result.put("data",list);
return result;
}啟動項目,運行接口http://localhost:8083/user/list?name=小測試,控制臺sql如下:

2.案例二:查看姓李的并且郵箱不為空的用戶列表
sql實現(xiàn):
select * from t_user
where del_flag = 0
and name like concat('李','%')
and email is not null
order by create_time desc
queryWrapper實現(xiàn):
/**
* 案例二:查看姓張的并且郵箱不為空的用戶列表
* @return
*/
@RequestMapping("/list2")
public Map<String,Object> getList2(){
Map<String,Object> result = new HashMap<>();
//構(gòu)建一個查詢的wrapper
QueryWrapper<User> wrapper = new QueryWrapper<User>();
//姓張的
wrapper.likeRight("name","張");
//郵箱不為空
wrapper.isNotNull("email");
//未刪除
wrapper.eq("del_flag",0);
//創(chuàng)建時間降序
wrapper.orderByDesc("create_time");
List<User> list = userMapper.selectList(wrapper);
result.put("data",list);
return result;
}
控制臺結(jié)果:

3.案例三:年齡范圍查詢(20-30之間的)
sql實現(xiàn):
select * from t_user where del_flag=0 and age between 20 and 30 order by create_time desc
queryWrapper實現(xiàn):
/**
* 案例三:年齡范圍查詢(20-30之間的)
* @return
*/
@RequestMapping("/list3")
public Map<String,Object> getList3(){
Map<String,Object> result = new HashMap<>();
//構(gòu)建一個查詢的wrapper
QueryWrapper<User> wrapper = new QueryWrapper<User>();
//年齡20-30之間的
wrapper.between("age",20,30);
//未刪除
wrapper.eq("del_flag",0);
//創(chuàng)建時間降序
wrapper.orderByDesc("create_time");
List<User> list = userMapper.selectList(wrapper);
result.put("data",list);
return result;
}
控制臺結(jié)果:

4.案例四:根據(jù)createTime查看當日的用戶列表
sql實現(xiàn):
select * from t_user
where del_flag=0
and DATE(create_time) = STR_TO_DATE('2021-08-13','%Y-%m-%d')
order by create_time desc
queryWrapper實現(xiàn):
/**
* 案例四:根據(jù)createTime查看當日的用戶列表
* @return
*/
@RequestMapping("/list4")
public Map<String,Object> getList4(@RequestParam String createTime){
Map<String,Object> result = new HashMap<>();
//構(gòu)建一個查詢的wrapper
QueryWrapper<User> wrapper = new QueryWrapper<User>();
//查詢條件為創(chuàng)建時間
wrapper.apply(StringUtils.isNotBlank(createTime),"DATE(create_time) = STR_TO_DATE('"+createTime+"','%Y-%m-%d')");
//未刪除
wrapper.eq("del_flag",0);
//創(chuàng)建時間降序
wrapper.orderByDesc("create_time");
List<User> list = userMapper.selectList(wrapper);
result.put("data",list);
return result;
}
控制臺結(jié)果:

5.案例五:查看某個時間段內(nèi)的用戶列表
sql實現(xiàn):
select * from t_user
where del_flag=0
and DATE(create_time) >= STR_TO_DATE('2021-08-01','%Y-%m-%d')
AND DATE(create_time) <= STR_TO_DATE('2021-08-13','%Y-%m-%d')
order by create_time desc
queryWrapper實現(xiàn):
/**
* 案例五:查看某個時間段內(nèi)的用戶列表
* @return
*/
@RequestMapping("/list5")
public Map<String,Object> getList5(@RequestParam String startTime,@RequestParam String endTime){
Map<String,Object> result = new HashMap<>();
//構(gòu)建一個查詢的wrapper
QueryWrapper<User> wrapper = new QueryWrapper<User>();
//查詢條件為創(chuàng)建時間
wrapper.apply(StringUtils.isNotBlank(startTime),"DATE(create_time) >= STR_TO_DATE('"+startTime+"','%Y-%m-%d')");
wrapper.apply(StringUtils.isNotBlank(endTime),"DATE(create_time) <= STR_TO_DATE('"+endTime+"','%Y-%m-%d')");
//未刪除
wrapper.eq("del_flag",0);
//創(chuàng)建時間降序
wrapper.orderByDesc("create_time");
List<User> list = userMapper.selectList(wrapper);
result.put("data",list);
return result;
}
控制臺結(jié)果:

6.案例六:查詢姓李的并且郵箱不為空或者是年齡大于16的用戶
sql實現(xiàn):
select * from t_user
where del_flag=0
and name like concat('李','%')
and (email is not null or age>16)
order by create_time desc
queryWrapper實現(xiàn):and方法嵌套使用
/**
* 案例六:查詢姓李的并且郵箱不為空或者是年齡大于16的用戶
* @return
*/
@RequestMapping("/list6")
public Map<String,Object> getList6(){
Map<String,Object> result = new HashMap<>();
//構(gòu)建一個查詢的wrapper
QueryWrapper<User> wrapper = new QueryWrapper<User>();
//and方法嵌套
wrapper.likeRight("name","李").and(
userQueryWrapper -> userQueryWrapper.isNotNull("email")
.or().lt("age",16)
);
//未刪除
wrapper.eq("del_flag",0);
//創(chuàng)建時間降序
wrapper.orderByDesc("create_time");
List<User> list = userMapper.selectList(wrapper);
result.put("data",list);
return result;
}
控制臺結(jié)果:

7.案例七:查詢id為1,2,3的用戶列表信息
sql實現(xiàn):
select * from t_user where del_flag=0 and id in(1,2,3) order by create_time desc
queryWrapper實現(xiàn):
/**
* 案例七:根據(jù)ids查看用戶列表信息
* @return
*/
@RequestMapping("/list7")
public Map<String,Object> getList7(@RequestParam String ids){
Map<String,Object> result = new HashMap<>();
//構(gòu)建一個查詢的wrapper
QueryWrapper<User> wrapper = new QueryWrapper<User>();
if(StringUtils.isNotBlank(ids)){
//字符串轉(zhuǎn)數(shù)組再轉(zhuǎn)List
Collection<String> collection = Arrays.asList(ids.split(","));
//in方法
wrapper.in(collection.size()>0,"id",collection);
}
//未刪除
wrapper.eq("del_flag",0);
//創(chuàng)建時間降序
wrapper.orderByDesc("create_time");
List<User> list = userMapper.selectList(wrapper);
result.put("data",list);
return result;
}
控制臺結(jié)果:

四、示例源碼
可點擊此處下載!
本文介紹就到這里了,感興趣的小伙伴可以自行測試哦。
總結(jié)
到此這篇關(guān)于Mybatis-plus動態(tài)條件查詢QueryWrapper使用的文章就介紹到這了,更多相關(guān)Mybatis-plus動態(tài)條件查詢QueryWrapper內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何使用Jetty實現(xiàn)嵌入式的Servlet容器
這篇文章主要介紹了Java使用Jetty實現(xiàn)嵌入式的Servlet容器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們來一起了解一下吧2019-06-06
MybatisPlus為何可以不用@MapperScan詳解
這篇文章主要給大家介紹了關(guān)于MybatisPlus為何可以不用@MapperScan的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家學習或者使用MybatisPlus具有一定的參考學習價值,需要的朋友可以參考下2023-04-04
RabbitMQ 3.9.7 鏡像模式集群與Springboot 2.5.5 整合
今天我們來聊聊 RabbitMQ 3.9.7 鏡像模式集群與Springboot 2.5.5 整合,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2021-10-10

