Spring Boot学习随笔- 集成MyBatis-Plus(二)条件查询QueryWrapper、聚合函数的使用、Lambda条件查询

news2024/11/18 11:17:57

学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备!

查询方法详解

  • 普通查询

    // 根据主键id去查询单个结果的。
    @Test
    public void selectById() {
        User user = userMapper.selectById(1739970502337392641L);
        System.out.println(user);
    }
    
    //根据多个主键id批量查询结果的
    @Test
    public void selectIds() {
        List<Long> list = Arrays.asList(1739970502337392641L, 1739983903621038082L, 1739984905459900417L);
        List<User> userList = userMapper.selectBatchIds(list);
        userList.forEach(System.out::println);
    }
    // 根据多个条件查询结果的
    @Test
    public void selectByMap() {
        // map.put("name","小明")
        // map.put("age",30)
        // 相当于 where name ="小明" and age=30
        Map<String, Object> columnMap = new HashMap<>();
        columnMap.put("name", "小刚");
        columnMap.put("age", "18");
        List<User> userList = userMapper.selectByMap(columnMap);
        userList.forEach(System.out::println);
    }
    
  • 条件构造器查询 【重要】

    AbstractWrapper 是 MyBatis Plus 中的一个抽象类,用于构建 SQL 查询条件。定义了泛型 TCChildren。其中,T 表示实体类的类型,C 表示查询条件的类型,Children 表示子类的类型,用于支持链式调用。它提供了一系列方法,用于构建 SQL 查询条件,包括设置查询字段、设置查询条件、排序等。

    常用实现类包括 QueryWrapperUpdateWrapper。这两个类都是 MyBatis Plus 提供的具体实现,用于构建查询条件和更新条件。

  • 条件构造器查询示例

    @SpringBootTest
    public class SelectTests {
        @Autowired
        private UserMapper userMapper;
    
        /**
         * 1.名字中包含刘且年龄大于20
         * name like '%刘%' and age>20
         */
        @Test
        public void selectByWrapper() {
            // 创建queryWrapper的两种方式
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //        QueryWrapper<User> queryWrapper1 = Wrappers.<User>query();
            queryWrapper.like("name", "刘").gt("age", 20);
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
    
        /**
         * 2.名字中包含刘且年龄大于等于20且小于30并且email不为空
         * name like ‘%刘’ and age between 20 and 30 and email is not null
         */
        @Test
        public void selectByWrapper2() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.like("name", "刘").between("age", 20, 30).isNull("email");
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
    
        /**
         * 3.名字中包含刘或年龄大于等于20,按照年龄降序排序,年龄相同按照id升序排列
         * name like ‘%刘’ and age between 20 and 30 and email is not null
         */
        @Test
        public void selectByWrapper3() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.like("name", "刘").or().ge("age",20)
                    .orderByDesc("age")
                    .orderByAsc("user_id");
    
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
        /**
         * 4.创建日期为2023年12月17日并且直属上级为王姓
         * date_format(create_time,'%Y-%m-$d') and manager_id in(select id from user where name like '王%'
         */
        @Test
        public void selectByWrapper4() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.apply("date_format(create_time,'%Y-%m-%d')={0}", "2023-12-27") //  使用占位符避免sql注入的风险
                    .inSql("manager_id","select user_id from mp_user where name like '王%'");
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
        /**
         * 5.名字为刘姓且年龄小于30或者邮箱不为空
         * name like '王%' and (age<20 or email is not null)
         */
        @Test
        public void selectByWrapper5() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.likeRight("name", "刘")
                    .and(wq -> wq.lt("age", 30).or().isNotNull("email"));
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
        /**
         * 6.名字为刘姓或者(年龄小于30且大于20并且邮箱不为空)
         * name like '刘%' or (age<30 and age>20 and email is not null)
         */
        @Test
        public void selectByWrapper6() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.likeRight("name", "刘")
                    .or(wq -> wq.lt("age", 30).gt("age", 20)
                            .isNotNull("email"));
    
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
        /**
         * 7.(年龄小于30且邮箱不为空)并且名字为刘姓
         *  (age<30 or email is not null) and name like '刘%'
         */
        @Test
        public void selectByWrapper7() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.nested(wq -> wq.lt("age", 30)
                            .or().isNotNull("email"))
                    .likeRight("name", "刘");
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
        /**
         * 8. 年龄为 21 25 33
         *  age in(21,25,33)
         */
        @Test
        public void selectByWrapper8() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.in("age", 21, 25, 33);
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
        /**
         * 9. 只返回满足条件的其中一条语句即可
         *  limit 1
         */
        @Test
        public void selectByWrapper9() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.in("age", 21, 25, 33).last("limit 1"); // last() 有sql注入的风险,谨慎使用
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
    }
    
  • select 不列出全部字段

     /**
       * 10.名字中包含刘且年龄小于30(需求1加强版)
       */
      @Test
      public void selectByWrapper() {
          QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //        queryWrapper.select("user_id","name","age").like("name", "刘").lt("age", 30); // 包含字段
          queryWrapper.like("name", "刘").lt("age", 30)
                  .select(User.class, info ->
                          !info.getColumn().equals("create_time") && !info.getColumn().equals("manager_id"));// 排除字段
          List<User> list = userMapper.selectList(queryWrapper);
          list.forEach(System.out::println);
      }
    
  • condition作用

    根据判断决定查询条件是否加到sql语句里面

    @Test
        public void testCondition() {
            String name = "东";
            String email = "";
            condition(name, email);
        }
        private void condition(String name, String email) {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //        if (StringUtils.isNotEmpty(name)) {
    //            queryWrapper.like("name", name);
    //        }
    //        if (StringUtils.isNotEmpty(email)) {
    //            queryWrapper.like("email", email);
    //        }
            queryWrapper.like(StringUtils.isNotEmpty(name), "name", name)
                    .like(StringUtils.isNotEmpty(email), "email", email);
            List<User> list = userMapper.selectList(queryWrapper);
            list.forEach(System.out::println);
        }
    
  • 实体作为条件构造器构造方法的参数

    @Test
    public void selectByWrapperEntity() {
        User user = new User();
        user.setRealName("小刚");
        user.setAge(18);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);
    }
    运行结果的sql语句:SELECT * FROM mp_user WHERE **name=? AND age=?**
    会把set注入的属性和值映射到where条件中
    
    • 通过SqlCondition 更改查询条件

      用法
      @TableField(condition = SqlCondition.LIKE)
      private String name;
      @TableField(condition = "%s&lt;#{%s}") //根据定义的常量,自己也可以参考并更改
      private Integer age;
      运行结果:SELECT * FROM mp_user WHERE **name LIKE CONCAT('%',?,'%')** AND AND age<?
      
  • allEq

    **allEq**是一个查询条件配置方法,用于构建查询条件。它可以根据传入的条件参数,生成一个包含所有等值条件的查询条件对象。

    @Test
    public void selectByWrapperAllEq() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        Map<String, Object> params = new HashMap<>();
        params.put("name", "小明");
        params.put("age", null);
        **queryWrapper.allEq(params,false)**; // false代表忽略值为null的字段,即不参与where条件
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);
    }
    
  • 其他条件构造器

    **selectMaps 返回**

    @Test
        public void selectByWrapperMaps() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("user_id","name").like("name", "刘").lt("age", 30);
    //        List<User> list = userMapper.selectList(queryWrapper);// 返回值为实体类的话,没设置的值还是会返回,只不过值为null
            List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper);// 只返回限定的字段
            userList.forEach(System.out::println);
        }
    
        /** 示例
         * 11.按照直属上级分组,查询每组的平均年龄、最大年龄、最小年龄,并且至取年龄总和为500的组
         * select avg(age)avg_age,min(age) min_age,max(age) max_age from user group by manager_id having sum(age)<500
         */
        @Test
        public void selectByWrapperMaps2() {
            QueryWrapper<User> queryWrapper = new QueryWrapper<>();
            queryWrapper.select("avg(age) avg_age", "min(age) min_age", "max(age) max_age")
                    .groupBy("manager_id").having("sum(age)<{0}", 500);
            List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper);
            userList.forEach(System.out::println);
        }
    
  • lambda条件构造器

    @Test
    public void selectLambda() {
        //创建lambda条件构造器的三种方式
        LambdaQueryWrapper<User> lambda = new LambdaQueryWrapper<>();
        LambdaQueryWrapper<User> lambda2 = new QueryWrapper<User>().lambda();
        LambdaQueryWrapper<User> lambda3= Wrappers.<User>lambdaQuery();
    
        lambda3.like(User::getName, "刘")
                .lt(User::getAge, 30); // where name like '%雨%' and age<30
        List<User> userList = userMapper.selectList(lambda3);
        userList.forEach(System.out::println);
    }
    /**
     * 5.名字为刘姓且(年龄小于30或邮箱不为空)
     * name like '刘%' and (age<30 or email is not null)
     */
    @Test
    public void selectLambda2() {
        LambdaQueryWrapper<User> lambda= Wrappers.<User>lambdaQuery();
        lambda.like(User::getName, "刘")
                .and(wq -> wq.lt(User::getAge, 20)
                        .or().isNotNull(User::getEmail));
        List<User> userList = userMapper.selectList(lambda);
        userList.forEach(System.out::println);
    }
    // 链式调用多个条件 LambdaQueryChainWrapper
    @Test
    public void selectLambda3() {
        List<User> userList = new LambdaQueryChainWrapper<>(userMapper)
                .like(User::getName, "刘").ge(User::getAge, 20).list();
        userList.forEach(System.out::println);
    }
    

    Spring Boot学习随笔- 集成MyBatis-Plus(三)自定义SQL、分页实现(PaginationInterceptor )、更新和删除详细方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1352081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv期末练习题(3)附带解析

创建黑色画板&#xff0c;并支持两种画图功能 import mathimport cv2 import numpy as np """ 1. 创建一个黑色画板 2. 输入q退出 3. 输入m切换画图模式两种模式&#xff0c;画矩形和画圆形。用户按住鼠标左键到一个位置然后释放就可以画出对应的图像 "&qu…

Eureka学习思维导图

一、Eureka Server原理解析 参考&#xff1a;https://www.jianshu.com/p/eb690e6ab11d 二、Eureka Client源码解析 参考&#xff1a;https://www.jianshu.com/p/6e8850387da6

Threejs项目实战之四:实现地图雷达效果

目录 最终效果代码实现创建项目DigitalMapView.vue的核心代码 最终效果 最近事情比较多&#xff0c;今晚难得有空&#xff0c;就抽空完成了一个使用Threejs实现地图雷达扫描效果的程序&#xff0c;下面说下代码实现的原理及核心代码&#xff0c;老规矩&#xff0c;先看下效果图…

专业服务新篇章:ToB行业运营达人的能力与策略

又逢年底&#xff0c;这两天冷空气南袭&#xff0c;深圳的天气也转为湿冷&#xff0c;又到了年终总结复盘的时候了&#xff0c;其实这样的天气挺适合做深度的思考&#xff0c;清冷的空气&#xff0c;可以让人保持清醒。 月初市场同事希望我写点东西&#xff0c;题目内容自拟&a…

7-验证码识别

文章目录 验证码识别1、验证码的用途和分类验证码的作用验证身份验证行为 验证码的类型静态验证码&#xff1a;图片验证码问答式验证码问答式验证码行为式验证码&#xff1a;点击行为式验证码&#xff1a;拖动间接式验证码&#xff1a;短信、邮件、语音电话无感验证码 2、验证码…

2023年12月青少年软件编程Python等级考试(三级)真题试卷

2023年12月青少年软件编程Python等级考试&#xff08;三级&#xff09;真题试卷 题目总数&#xff1a;38 总分数&#xff1a;100 选择题 第 1 题 单选题 一个非零的二进制正整数&#xff0c;在其末尾添加两个“0”&#xff0c;则该新数将是原数的&#xff1f;&#x…

虹科方案丨从困境到突破:TigoLeap方案引领数据采集与优化变革

来源&#xff1a;虹科工业智能互联 虹科方案丨从困境到突破&#xff1a;TigoLeap方案引领数据采集与优化变革 原文链接&#xff1a;https://mp.weixin.qq.com/s/H3pd5G8coBvyTwASNS_CFA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 在数字化工厂和智能制造时…

mcu与上位机通讯数据传输测速

问题 如何测量mcu与上位机通讯数据传输速度&#xff1f;&#xff08;串口、USB&#xff09; 解决 可以借助Bus Hound 将显示时间戳勾上。 发送一段固定长度的数据&#xff0c;然后除起始和结束的时间差 最后计算即可。

xadmin-plus

python之Xadmin-plus是什么&#xff1f; xadmin-plus: xadmin的django3.2版本支持。 Xadmin是一个非常优秀的Django Admin插件&#xff0c;可惜的是已经停止更新。Xadmin-plus对其进行了升级兼容。支持python3.10、Django3.2。 特性 Django Admin直接替换基于Twitter Boots…

安装Keras用于影像分割

conda create -n tfkears2024 python3.9.18 activate tfkeras2024 pip install tensorflow-gpu2.9.0 pip install keras pip install scipy pip install ipykernel ipython python -m ipykernel install --name tfkears2024

深度生成模型之GAN基础 ->(个人学习记录笔记)

文章目录 深度生成模型之GAN基础生成对抗网络1. 生成对抗网络如何生成数据2. 生成对抗原理3. GAN的核心优化目标4. D的优化5. GAN的理想状态6. GAN的训练7. 梯度不稳定与模式崩塌(collapse mode)问题8. 梯度消失问题 深度生成模型之GAN基础 生成对抗网络 1. 生成对抗网络如何…

【华为机试】2023年真题B卷(python)-靠谱的车

一、题目 题目描述&#xff1a; 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xff0c;总是偏大。 出租车司机解释说他不喜欢数字4&#xff0c;所以改装了计费表&#xff0c;任何数字位置遇到数字4就直接跳过&#xff0c;其…

关于使用 @iconify/iconify图标库组件在vite中的使用

Iconify 是最通用的图标框架&#xff0c;将各种图标库的图标集中在这里的一个组件库&#xff0c;例如ant-design,element-ui等 网站地址如下 https://iconify.design/getting-started/ 使用过程如下 npm install iconify/iconify -S npm install vite-plugin-purge-icons icon…

【SpringBoot3】命令行运行jar包报错可能的一些原因

端口号冲突&#xff1a; 有其他的web程序在运行&#xff0c;占用了8080端口没有主清单属性&#xff1a; 在打包jar包前&#xff0c;没有加入打包的插件spring-boot-maven-plugin&#xff0c;参考1.SpringBoot入门的第一个完整小项目&#xff08;新手保姆版教会打包&#xff09;…

Dockerfile与DockerCompose

Docker的Image结构是怎样的&#xff1f; 镜像是将应用程序 及其需要的 系统函数库、环境、配置、依赖 打包而成。 镜像结构 入口&#xff08; Entrypoint &#xff09; 镜像运行入口&#xff0c;一般是程序启动的脚本和参数 层&#xff08; Layer &#xff09; 在BaseImage基…

Alibaba Cloud Linux镜像操作系统详解(全方位解析)

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版&#xff0c;针对阿里云服务器ECS做了大量深度优化&#xff0c;Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS&#xff0c;Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…

Linux 进程(五) 调度与切换

概念准备 当一个进程放在cpu上运行时&#xff0c;是必须要把进程的代码跑完才会进行下一个进程吗&#xff1f;答案肯定是 不对。现在的操作系统都是基于时间片轮转执行的。 时间片&#xff08;timeslice&#xff09;又称为“量子&#xff08;quantum&#xff09;”或“处理器片…

设计模式之原型模式【创造者模式】

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

数据库云平台新数科技完成B轮融资,打造全链路智能化数据库云平台

数据库云平台软件厂商「北京新数科技有限公司」&#xff08;以下简称「新数科技」&#xff09;已于2023年完成B1轮和B2轮融资&#xff0c;分别由渤海创富和彬复资本投资&#xff1b;义柏资本担任本轮融资独家财务顾问。 新数科技成立于2014年&#xff0c;当前产品矩阵包括数据库…

120基于matlab的LMS自适应滤波算法

基于matlab的LMS自适应滤波算法&#xff0c;如、解相关LMS算法&#xff0c;滤波型LMS算法&#xff0c;变换域LMS算法&#xff0c;输出滤波前后及学习曲线图。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 120自适应滤波算法变换域LMS算法 (xiaohongshu.com…