当前位置:   article > 正文

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

mybatis querywrapper

一、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.创建数据库表并添加几条数据:

  1. CREATE TABLE `t_user` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  3. `name` varchar(255) DEFAULT NULL COMMENT '用户姓名',
  4. `age` int(2) DEFAULT NULL COMMENT '用户年龄',
  5. `email` varchar(255) DEFAULT NULL COMMENT '邮箱',
  6. `del_flag` int(1) DEFAULT '0' COMMENT '删除标识 0:正常 1:删除 默认0',
  7. `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  8. `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='用户表';

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

2.创建Springboot项目

创建Springboot项目,集成mybatis-plus、web、mysql等相关依赖;搭建基础的demo操作:
(1)pom.xml:

  1. <!--web-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <!--热部署-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-devtools</artifactId>
  10. <scope>runtime</scope>
  11. <optional>true</optional>
  12. </dependency>
  13. <!--mybatis-plus自动的维护了mybatis以及mybatis-spring的依赖,
  14. 在springboot中这三者不能同时的出现,避免版本的冲突,表示:跳进过这个坑-->
  15. <!--mybatis-plus-->
  16. <dependency>
  17. <groupId>com.baomidou</groupId>
  18. <artifactId>mybatis-plus-boot-starter</artifactId>
  19. <version>3.4.3</version>
  20. </dependency>
  21. <!--mysql驱动-->
  22. <dependency>
  23. <groupId>mysql</groupId>
  24. <artifactId>mysql-connector-java</artifactId>
  25. <scope>runtime</scope>
  26. </dependency>
  27. <!-- alibaba的druid数据库连接池 -->
  28. <dependency>
  29. <groupId>com.alibaba</groupId>
  30. <artifactId>druid</artifactId>
  31. <version>1.1.20</version>
  32. </dependency>
  33. <!-- alibaba的druid数据库连接池 -->
  34. <dependency>
  35. <groupId>com.alibaba</groupId>
  36. <artifactId>druid-spring-boot-starter</artifactId>
  37. <version>1.1.20</version>
  38. </dependency>
  39. <!--lombok-->
  40. <dependency>
  41. <groupId>org.projectlombok</groupId>
  42. <artifactId>lombok</artifactId>
  43. <optional>true</optional>
  44. </dependency>
  45. <!--工具类-->
  46. <dependency>
  47. <groupId>org.apache.commons</groupId>
  48. <artifactId>commons-lang3</artifactId>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-starter-test</artifactId>
  53. <scope>test</scope>
  54. </dependency>

 (2)配置application.yml

  1. # 服务端口
  2. server:
  3. port: 8083
  4. # 数据源配置
  5. spring:
  6. datasource:
  7. name: test
  8. url: jdbc:mysql://localhost:3306/db_order?&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSl=false
  9. username: root
  10. password: root
  11. driver-class-name: com.mysql.jdbc.Driver
  12. type: com.alibaba.druid.pool.DruidDataSource
  13. ## 配置连接池信息
  14. ## 初始化大小,最小,最大
  15. initialSize: 5
  16. minIdle: 5
  17. maxActive: 30
  18. ## 配置获取连接等待超时的时间
  19. maxWait: 60000
  20. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  21. timeBetweenEvictionRunsMillis: 60000
  22. # 配置一个连接在池中最小生存的时间,单位是毫秒
  23. minEvictableIdleTimeMillis: 300000
  24. validationQuery: SELECT 1 FROM DUAL
  25. testWhileIdle: true
  26. testOnBorrow: false
  27. testOnReturn: false
  28. poolPreparedStatements: true
  29. maxPoolPreparedStatementPerConnectionSize: 20
  30. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
  31. filters: stat,wall
  32. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
  33. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  34. # 超过时间限制是否回收
  35. removeAbandoned: true
  36. # 超时时间;单位为秒。180=3分钟
  37. removeAbandonedTimeout: 180
  38. # 关闭abanded连接时输出错误日志
  39. logAbandoned: true
  40. # mybatis-plus 默认扫描mapper.xml的目录
  41. mybatis-plus:
  42. mapper-locations: classpath*:/mapper/*.xml
  43. #配置sql打印日志
  44. configuration:
  45. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

(3)创建一个实体类:

  1. /**
  2. * @author qzz
  3. */
  4. @Data
  5. @TableName("t_user")
  6. public class User implements Serializable {
  7. private static final long serialVersionUID = 1L;
  8. /**
  9. * 用户id
  10. */
  11. @TableId(value="id", type = IdType.AUTO)
  12. private Integer id;
  13. /**
  14. * 名称
  15. */
  16. @TableField("name")
  17. private String name;
  18. /**
  19. * 年龄
  20. */
  21. @TableField("age")
  22. private Integer age;
  23. /**
  24. * 删除标识 0:正常 1:删除 默认0
  25. */
  26. @TableField("del_flag")
  27. private Integer del_flag;
  28. /**
  29. * 邮箱
  30. */
  31. @TableField("email")
  32. private String email;
  33. /**
  34. * 创建时间
  35. */
  36. @TableField(value = "create_time", fill = FieldFill.INSERT)
  37. private Date create_time;
  38. /**
  39. * 修改时间
  40. */
  41. @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
  42. private Date update_time;
  43. }

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

  1. /**
  2. * @author qzz
  3. */
  4. @Repository
  5. public interface UserMapper extends BaseMapper<User> {
  6. }

三、queryWrapper示例

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

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

 

在这里插入图片描述

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

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

过滤条件:

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

sql实现:

  1. select * from t_user
  2. where del_flag = 0
  3. <if test ="name!=null and ''!=name">
  4. and name like concat('%',#{name},'%')
  5. </if>
  6. order by create_time desc

queryWrapper实现:

  1. /**
  2. * 案例一:根据name模糊查看未删除的用户列表信息
  3. * @param name
  4. * @return
  5. */
  6. @RequestMapping("/list")
  7. public Map<String,Object> getList(@RequestParam String name){
  8. Map<String,Object> result = new HashMap<>();
  9. //构建一个查询的wrapper
  10. QueryWrapper<User> wrapper = new QueryWrapper<User>();
  11. //name不为空时,组装模糊查询条件
  12. wrapper.like(StringUtils.isNotBlank(name),"name",name);
  13. //未删除
  14. wrapper.eq("del_flag",0);
  15. //创建时间降序
  16. wrapper.orderByDesc("create_time");
  17. List<User> list = userMapper.selectList(wrapper);
  18. result.put("data",list);
  19. return result;
  20. }

 

启动项目,运行接口http://localhost:8083/user/list?name=小测试,控制台sql如下:
在这里插入图片描述

2.案例二:查看姓李的并且邮箱不为空的用户列表

sql实现:

  1. select * from t_user
  2. where del_flag = 0
  3. and name like concat('李','%')
  4. and email is not null
  5. order by create_time desc

 queryWrapper实现:

  1. /**
  2. * 案例二:查看姓张的并且邮箱不为空的用户列表
  3. * @return
  4. */
  5. @RequestMapping("/list2")
  6. public Map<String,Object> getList2(){
  7. Map<String,Object> result = new HashMap<>();
  8. //构建一个查询的wrapper
  9. QueryWrapper<User> wrapper = new QueryWrapper<User>();
  10. //姓张的
  11. wrapper.likeRight("name","张");
  12. //邮箱不为空
  13. wrapper.isNotNull("email");
  14. //未删除
  15. wrapper.eq("del_flag",0);
  16. //创建时间降序
  17. wrapper.orderByDesc("create_time");
  18. List<User> list = userMapper.selectList(wrapper);
  19. result.put("data",list);
  20. return result;
  21. }

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

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

sql实现:

  1. select * from t_user
  2. where del_flag=0
  3. and age between 20 and 30
  4. order by create_time desc

 queryWrapper实现:

  1. /**
  2. * 案例三:年龄范围查询(20-30之间的)
  3. * @return
  4. */
  5. @RequestMapping("/list3")
  6. public Map<String,Object> getList3(){
  7. Map<String,Object> result = new HashMap<>();
  8. //构建一个查询的wrapper
  9. QueryWrapper<User> wrapper = new QueryWrapper<User>();
  10. //年龄20-30之间的
  11. wrapper.between("age",20,30);
  12. //未删除
  13. wrapper.eq("del_flag",0);
  14. //创建时间降序
  15. wrapper.orderByDesc("create_time");
  16. List<User> list = userMapper.selectList(wrapper);
  17. result.put("data",list);
  18. return result;
  19. }

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

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

sql实现:

  1. select * from t_user
  2. where del_flag=0
  3. and DATE(create_time) = STR_TO_DATE('2021-08-13','%Y-%m-%d')
  4. order by create_time desc

queryWrapper实现:

  1. /**
  2. * 案例四:根据createTime查看当日的用户列表
  3. * @return
  4. */
  5. @RequestMapping("/list4")
  6. public Map<String,Object> getList4(@RequestParam String createTime){
  7. Map<String,Object> result = new HashMap<>();
  8. //构建一个查询的wrapper
  9. QueryWrapper<User> wrapper = new QueryWrapper<User>();
  10. //查询条件为创建时间
  11. wrapper.apply(StringUtils.isNotBlank(createTime),"DATE(create_time) = STR_TO_DATE('"+createTime+"','%Y-%m-%d')");
  12. //未删除
  13. wrapper.eq("del_flag",0);
  14. //创建时间降序
  15. wrapper.orderByDesc("create_time");
  16. List<User> list = userMapper.selectList(wrapper);
  17. result.put("data",list);
  18. return result;
  19. }

 

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

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

sql实现:

  1. select * from t_user
  2. where del_flag=0
  3. and DATE(create_time) >= STR_TO_DATE('2021-08-01','%Y-%m-%d')
  4. AND DATE(create_time) <= STR_TO_DATE('2021-08-13','%Y-%m-%d')
  5. order by create_time desc

 queryWrapper实现:

  1. /**
  2. * 案例五:查看某个时间段内的用户列表
  3. * @return
  4. */
  5. @RequestMapping("/list5")
  6. public Map<String,Object> getList5(@RequestParam String startTime,@RequestParam String endTime){
  7. Map<String,Object> result = new HashMap<>();
  8. //构建一个查询的wrapper
  9. QueryWrapper<User> wrapper = new QueryWrapper<User>();
  10. //查询条件为创建时间
  11. wrapper.apply(StringUtils.isNotBlank(startTime),"DATE(create_time) >= STR_TO_DATE('"+startTime+"','%Y-%m-%d')");
  12. wrapper.apply(StringUtils.isNotBlank(endTime),"DATE(create_time) <= STR_TO_DATE('"+endTime+"','%Y-%m-%d')");
  13. //未删除
  14. wrapper.eq("del_flag",0);
  15. //创建时间降序
  16. wrapper.orderByDesc("create_time");
  17. List<User> list = userMapper.selectList(wrapper);
  18. result.put("data",list);
  19. return result;
  20. }

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

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

sql实现:

  1. select * from t_user
  2. where del_flag=0
  3. and name like concat('李','%')
  4. and (email is not null or age>16)
  5. order by create_time desc

 queryWrapper实现:
and方法嵌套使用

  1. /**
  2. * 案例六:查询姓李的并且邮箱不为空或者是年龄大于16的用户
  3. * @return
  4. */
  5. @RequestMapping("/list6")
  6. public Map<String,Object> getList6(){
  7. Map<String,Object> result = new HashMap<>();
  8. //构建一个查询的wrapper
  9. QueryWrapper<User> wrapper = new QueryWrapper<User>();
  10. //and方法嵌套
  11. wrapper.likeRight("name","李").and(
  12. userQueryWrapper -> userQueryWrapper.isNotNull("email")
  13. .or().lt("age",16)
  14. );
  15. //未删除
  16. wrapper.eq("del_flag",0);
  17. //创建时间降序
  18. wrapper.orderByDesc("create_time");
  19. List<User> list = userMapper.selectList(wrapper);
  20. result.put("data",list);
  21. return result;
  22. }

 

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

7.案例七:查询id为1,2,3的用户列表信息

sql实现:

  1. select * from t_user
  2. where del_flag=0
  3. and id in(1,2,3)
  4. order by create_time desc

 queryWrapper实现:

  1. /**
  2. * 案例七:根据ids查看用户列表信息
  3. * @return
  4. */
  5. @RequestMapping("/list7")
  6. public Map<String,Object> getList7(@RequestParam String ids){
  7. Map<String,Object> result = new HashMap<>();
  8. //构建一个查询的wrapper
  9. QueryWrapper<User> wrapper = new QueryWrapper<User>();
  10. if(StringUtils.isNotBlank(ids)){
  11. //字符串转数组再转List
  12. Collection<String> collection = Arrays.asList(ids.split(","));
  13. //in方法
  14. wrapper.in(collection.size()>0,"id",collection);
  15. }
  16. //未删除
  17. wrapper.eq("del_flag",0);
  18. //创建时间降序
  19. wrapper.orderByDesc("create_time");
  20. List<User> list = userMapper.selectList(wrapper);
  21. result.put("data",list);
  22. return result;
  23. }

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

四、示例源码

可点击此处下载!

本文介绍就到这里了,感兴趣的小伙伴可以自行测试哦。


————————————————
版权声明:本文为CSDN博主「12程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26383975/article/details/119646390

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43712
推荐阅读
相关标签
  

闽ICP备14008679号