Mybatis-plus 动态条件查询QueryWrapper的使用

2022-07-10 12:25:38

一、queryWrapper介绍

queryWrapper是mybatis plus中实现查询的对象封装操作类,可以封装sql对象,包括where条件,order by排序,select哪些字段等等,他的层级关系如下:
在这里插入图片描述

Wrapper:条件构造抽象类,最顶端父类;
AbstractWrapper:用于查询条件封装,生成sql的where条件;
AbstractLambdaWrapper:Lambda语法使用Wrapper统一处理解析lambda获取column。
LambdaQueryWrapper:用于lambda语法使用的查询Wrapper;
LambdaUpdateWrapper:Lambda更新封装Wrapper;
QueryWrapper:Entity对象封装操作类,不是用lambda;
UpdateWrapper:Update条件封装,用于Entity对象更新操作。

二、环境搭建

1.创建数据库表并添加几条数据:

CREATETABLE`t_user`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'用户id',`name`varchar(255)DEFAULTNULLCOMMENT'用户姓名',`age`int(2)DEFAULTNULLCOMMENT'用户年龄',`email`varchar(255)DEFAULTNULLCOMMENT'邮箱',`del_flag`int(1)DEFAULT'0'COMMENT'删除标识 0:正常 1:删除  默认0',`create_time`datetimeDEFAULTNULLCOMMENT'创建时间',`update_time`datetimeDEFAULTNULLCOMMENT'更新时间',PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=3DEFAULTCHARSET=utf8COMMENT='用户表';

数据如下:
在这里插入图片描述

2.创建Springboot项目

创建Springboot项目,集成mybatis-plus、web、mysql等相关依赖;搭建基础的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中这三者不能同时的出现,避免版本的冲突,表示:跳进过这个坑--><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- alibaba的druid数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.20</version></dependency><!-- alibaba的druid数据库连接池 --><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

# 服务端口server:port:8083# 数据源配置spring:datasource:name: testurl: jdbc:mysql://localhost:3306/db_order?&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSl=falseusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource## 配置连接池信息## 初始化大小,最小,最大initialSize:5minIdle:5maxActive:30## 配置获取连接等待超时的时间maxWait:60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis:60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis:300000validationQuery: SELECT 1 FROM DUALtestWhileIdle:truetestOnBorrow:falsetestOnReturn:falsepoolPreparedStatements:truemaxPoolPreparedStatementPerConnectionSize:20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filters: stat,wall# 通过connectProperties属性来打开mergeSql功能;慢SQL记录connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000# 超过时间限制是否回收removeAbandoned:true# 超时时间;单位为秒。180秒=3分钟removeAbandonedTimeout:180# 关闭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)创建一个实体类:

/**
 * @author qzz
 */@Data@TableName("t_user")publicclassUserimplementsSerializable{privatestaticfinallong serialVersionUID=1L;/**
     * 用户id
     */@TableId(value="id", type=IdType.AUTO)privateInteger id;/**
     * 名称
     */@TableField("name")privateString name;/**
     * 年龄
     */@TableField("age")privateInteger age;/**
     * 删除标识 0:正常 1:删除  默认0
     */@TableField("del_flag")privateInteger del_flag;/**
     * 邮箱
     */@TableField("email")privateString email;/**
     * 创建时间
     */@TableField(value="create_time", fill=FieldFill.INSERT)privateDate create_time;/**
     * 修改时间
     */@TableField(value="update_time", fill=FieldFill.INSERT_UPDATE)privateDate update_time;}

(4)编写一个mapper接口,只需继承BaseMapper,基本的单表查询都给你封装好了。

/**
 * @author qzz
 */@RepositorypublicinterfaceUserMapperextendsBaseMapper<User>{}

三、queryWrapper示例

官网上可以看到有很多条件构造器,下面将使用几个常用的作为示例进行使用,其实本质还是sql语句,如果想要打印sql日志,可以在application.yml文件中进行如下的配置:

mybatis-plus:#配置sql打印日志configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

Wrapper是一个接口,官方提供了很多的实现类,我们通过其实现类去构造wrapper对象即可。

1.案例一:根据name模糊查看未删除的用户列表信息

过滤条件:

  • name 用户名称 ,模糊查看
  • del_flag = 0
  • 按照create_time创建时间降序

sql实现:

select*from t_userwhere del_flag=0<if test="name!=null and ''!=name">and namelike concat('%',#{name},'%')</if>orderby create_timedesc

queryWrapper实现:

/**
     * 案例一:根据name模糊查看未删除的用户列表信息
     * @param name
     * @return
     */@RequestMapping("/list")publicMap<String,Object>getList(@RequestParamString name){Map<String,Object> result=newHashMap<>();//构建一个查询的wrapperQueryWrapper<User> wrapper=newQueryWrapper<User>();//name不为空时,组装模糊查询条件
        wrapper.like(StringUtils.isNotBlank(name),"name",name);//未删除
        wrapper.eq("del_flag",0);//创建时间降序
        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实现:

select*from t_userwhere del_flag=0and namelike concat('李','%')and emailisnotnullorderby create_timedesc

queryWrapper实现:

/**
     * 案例二:查看姓张的并且邮箱不为空的用户列表
     * @return
     */@RequestMapping("/list2")publicMap<String,Object>getList2(){Map<String,Object> result=newHashMap<>();//构建一个查询的wrapperQueryWrapper<User> wrapper=newQueryWrapper<User>();//姓张的
        wrapper.likeRight("name","张");//邮箱不为空
        wrapper.isNotNull("email");//未删除
        wrapper.eq("del_flag",0);//创建时间降序
        wrapper.orderByDesc("create_time");List<User> list= userMapper.selectList(wrapper);
        result.put("data",list);return result;}

控制台结果:
在这里插入图片描述

3.案例三:年龄范围查询(20-30之间的)

sql实现:

select*from t_userwhere del_flag=0and agebetween20and30orderby create_timedesc

queryWrapper实现:

/**
     * 案例三:年龄范围查询(20-30之间的)
     * @return
     */@RequestMapping("/list3")publicMap<String,Object>getList3(){Map<String,Object> result=newHashMap<>();//构建一个查询的wrapperQueryWrapper<User> wrapper=newQueryWrapper<User>();//年龄20-30之间的
        wrapper.between("age",20,30);//未删除
        wrapper.eq("del_flag",0);//创建时间降序
        wrapper.orderByDesc("create_time");List<User> list= userMapper.selectList(wrapper);
        result.put("data",list);return result;}

控制台结果:在这里插入图片描述

4.案例四:根据createTime查看当日的用户列表

sql实现:

select*from t_userwhere del_flag=0andDATE(create_time)= STR_TO_DATE('2021-08-13','%Y-%m-%d')orderby create_timedesc

queryWrapper实现:

/**
     * 案例四:根据createTime查看当日的用户列表
     * @return
     */@RequestMapping("/list4")publicMap<String,Object>getList4(@RequestParamString createTime){Map<String,Object> result=newHashMap<>();//构建一个查询的wrapperQueryWrapper<User> wrapper=newQueryWrapper<User>();//查询条件为创建时间
        wrapper.apply(StringUtils.isNotBlank(createTime),"DATE(create_time) = STR_TO_DATE('"+createTime+"','%Y-%m-%d')");//未删除
        wrapper.eq("del_flag",0);//创建时间降序
        wrapper.orderByDesc("create_time");List<User> list= userMapper.selectList(wrapper);
        result.put("data",list);return result;}

控制台结果:
在这里插入图片描述

5.案例五:查看某个时间段内的用户列表

sql实现:

select*from t_userwhere del_flag=0andDATE(create_time)>= STR_TO_DATE('2021-08-01','%Y-%m-%d')ANDDATE(create_time)<= STR_TO_DATE('2021-08-13','%Y-%m-%d')orderby create_timedesc

queryWrapper实现:

/**
     * 案例五:查看某个时间段内的用户列表
     * @return
     */@RequestMapping("/list5")publicMap<String,Object>getList5(@RequestParamString startTime,@RequestParamString endTime){Map<String,Object> result=newHashMap<>();//构建一个查询的wrapperQueryWrapper<User> wrapper=newQueryWrapper<User>();//查询条件为创建时间
        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);//创建时间降序
        wrapper.orderByDesc("create_time");List<User> list= userMapper.selectList(wrapper);
        result.put("data",list);return result;}

控制台结果:
在这里插入图片描述

6.案例六:查询姓李的并且邮箱不为空或者是年龄大于16的用户

sql实现:

select*from t_userwhere del_flag=0and namelike concat('李','%')and(emailisnotnullor age>16)orderby create_timedesc

queryWrapper实现:
and方法嵌套使用

/**
     * 案例六:查询姓李的并且邮箱不为空或者是年龄大于16的用户
     * @return
     */@RequestMapping("/list6")publicMap<String,Object>getList6(){Map<String,Object> result=newHashMap<>();//构建一个查询的wrapperQueryWrapper<User
  • 作者:12程序猿
  • 原文链接:https://blog.csdn.net/qq_26383975/article/details/119646390
    更新时间:2022-07-10 12:25:38