码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MyBatisPlus 查询条件构造器(Wapper)


    一、wapper介绍 

    1、Wrapper家族

    在MP中我们可以使用通用Mapper(BaseMapper)实现基本查询,也可以使用自定义Mapper(自定义XML)来实现更高级的查询。当然你也可以结合条件构造器来方便的实现更多的高级查询。

    Wrapper : 条件构造抽象类,最顶端父类  

    AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

    QueryWrapper : 查询条件封装

    UpdateWrapper : Update 条件封装

    AbstractLambdaWrapper : 使用Lambda 语法

    LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper

    LambdaUpdateWrapper : Lambda 更新封装Wrapper

    2、创建测试类

    1. @SpringBootTest
    2. public class WrapperTests {
    3. @Resource
    4. private UserMapper userMapper;
    5. }

    二、QueryWrapper

    1、例1:组装查询条件

    查询名字中包含n,年龄大于等于10且小于等于20,email不为空的用户

    1. @Test
    2. public void test1() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper
    5. .like("name","n")
    6. .between("age", 10, 20)
    7. .isNotNull("email");
    8. List users = userMapper.selectList(queryWrapper);
    9. users.forEach(System.out::println);
    10. }

    2、例2:组装排序条件

    按年龄降序查询用户,如果年龄相同则按id升序排列

    1. @Test
    2. public void test2() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper
    5. .orderByDesc("age")
    6. .orderByAsc("id");
    7. List users = userMapper.selectList(queryWrapper);
    8. users.forEach(System.out::println);
    9. }

    3、例3:组装删除条件

    删除email为空的用户

    1. @Test
    2. public void test3() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper.isNull("email");
    5. int result = userMapper.delete(queryWrapper); //条件构造器也可以构建删除语句的条件
    6. System.out.println("delete return count = " + result);
    7. }

    4、例4:条件的优先级

    查询名字中包含n,且(年龄小于18或email为空的用户),并将这些用户的年龄设置为18,邮箱设置为 user@atguigu.com

    1. @Test
    2. public void test4() {
    3. //修改条件
    4. QueryWrapper queryWrapper = new QueryWrapper<>();
    5. queryWrapper
    6. .like("name", "n")
    7. .and(i -> i.lt("age", 18).or().isNull("email")); //lambda表达式内的逻辑优先运算
    8. User user = new User();
    9. user.setAge(18);
    10. user.setEmail("user@atguigu.com");
    11. int result = userMapper.update(user, queryWrapper);
    12. System.out.println(result);
    13. }

    5、例5:组装select子句

    查询所有用户的用户名和年龄

    1. @Test
    2. public void test5() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper.select("name", "age");
    5. //selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值为null
    6. List> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表
    7. maps.forEach(System.out::println);
    8. }

    6、例6:实现子查询

    查询id不大于3的所有用户的id列表

    1. @Test
    2. public void test6() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper.inSql("id", "select id from user where id <= 3");
    5. //selectObjs的使用场景:只返回一列
    6. List objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
    7. objects.forEach(System.out::println);
    8. }
    9. 但上面的方式容易引发sql注入

      queryWrapper.inSql("id", "select id from user where id <= 3 or true"); // 或插叙出所有用户id

      可以使用下面的查询方式替换

      1. queryWrapper.in("id", 1, 2, 3 );
      2. // 或
      3. queryWrapper.le("id", 3 );

      三、UpdateWrapper

      例7:需求同例4

      查询名字中包含n,且(年龄小于18或email为空的用户),并将这些用户的年龄设置为18,邮箱设置为 user@atguigu.com

      1. @Test
      2. public void test7() {
      3. //组装set子句
      4. UpdateWrapper updateWrapper = new UpdateWrapper<>();
      5. updateWrapper
      6. .set("age", 18)
      7. .set("email", "user@atguigu.com")
      8. .like("name", "n")
      9. .and(i -> i.lt("age", 18).or().isNull("email")); //lambda表达式内的逻辑优先运算
      10. //这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
      11. User user = new User();
      12. int result = userMapper.update(user, updateWrapper);
      13. System.out.println(result);
      14. }

      四、condition

      例8:动态组装查询条件

      查询名字中包含n,年龄大于10且小于20的用户,查询条件来源于用户输入,是可选的

      1. @Test
      2. public void test8() {
      3. //定义查询条件,有可能为null(用户未输入)
      4. String name = null;
      5. Integer ageBegin = 10;
      6. Integer ageEnd = 20;
      7. QueryWrapper queryWrapper = new QueryWrapper<>();
      8. if(StringUtils.isNotBlank(name)){
      9. queryWrapper.like("name","n");
      10. }
      11. if(ageBegin != null){
      12. queryWrapper.ge("age", ageBegin);
      13. }
      14. if(ageEnd != null){
      15. queryWrapper.le("age", ageEnd);
      16. }
      17. List users = userMapper.selectList(queryWrapper);
      18. users.forEach(System.out::println);
      19. }

      上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition参数的重载方法构建查询条件,简化代码的编写

      1. @Test
      2. public void test8Condition() {
      3. //定义查询条件,有可能为null(用户未输入)
      4. String name = null;
      5. Integer ageBegin = 10;
      6. Integer ageEnd = 20;
      7. QueryWrapper queryWrapper = new QueryWrapper<>();
      8. queryWrapper
      9. .like(StringUtils.isNotBlank(name), "name", "n")
      10. .ge(ageBegin != null, "age", ageBegin)
      11. .le(ageEnd != null, "age", ageEnd);
      12. List users = userMapper.selectList(queryWrapper);
      13. users.forEach(System.out::println);
      14. }

      五、LambdaXxxWrapper

      1、例9:Query - 需求同例8

      1. @Test
      2. public void test9() {
      3. //定义查询条件,有可能为null(用户未输入)
      4. String name = null;
      5. Integer ageBegin = 10;
      6. Integer ageEnd = 20;
      7. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
      8. queryWrapper
      9. //避免使用字符串表示字段,防止运行时错误
      10. .like(StringUtils.isNotBlank(name), User::getName, "n")
      11. .ge(ageBegin != null, User::getAge, ageBegin)
      12. .le(ageEnd != null, User::getAge, ageEnd);
      13. List users = userMapper.selectList(queryWrapper);
      14. users.forEach(System.out::println);
      15. }

      2、例10:Update - 需求同例4

      1. @Test
      2. public void test10() {
      3. //组装set子句
      4. LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
      5. updateWrapper
      6. .set(User::getAge, 18)
      7. .set(User::getEmail, "user@atguigu.com")
      8. .like(User::getName, "n")
      9. .and(i -> i.lt(User::getAge, 18).or().isNull(User::getEmail)); //lambda表达式内的逻辑优先运算
      10. User user = new User();
      11. int result = userMapper.update(user, updateWrapper);
      12. System.out.println(result);
      13. }
    10. 相关阅读:
      QT(9.1)对话框与事件处理
      vue源码分析(三)——new Vue 的过程(详解data定义值后如何获取的过程)
      【LIN总线测试】——LIN主节点调度表测试
      高效管理文件:如何通过文件数量归类提高工作效率
      Restormer: Efficient Transformer for High-Resolution Image Restoration
      进程的环境变量
      Java基础~线程和进程(3) 多线程编程细节
      编程堆芯熔融物自然对流的
      [Mac软件]Goldie App v2.2 Mac黄金比例设计工具
      html中一些简单的css动画 包括滚动进度条 滑动动画
    11. 原文地址:https://blog.csdn.net/weixin_55076626/article/details/127131080
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号