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

学习视频:【编程不良人】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.mfbz.cn/a/297854.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opencv007 图像运算——加减乘除

今天学习图像处理的基础——加减乘除&#xff0c;总体来说比较好理解&#xff0c;不过生成的图片千奇百怪哈哈哈哈 opencv中图像的运算本质是矩阵的运算 加法 做加法之前要求两张图片形状&#xff0c;长宽&#xff0c;通道数完全一致 cv2.add(img1, img2) add的规则是两个图…

MySQL之视图内连接、外连接、子查询

一、视图 1.1 含义 虚拟表&#xff0c;和普通表一样使用 视图&#xff08;view&#xff09;是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。但是&#xff0c;数据库中只存放了视图的定义&#xff0c;而并没有存放…

Visio导出eps格式图片

Visio导出eps格式图片 文章目录 Visio导出eps格式图片1. Visio中使用Adobe Acrobat虚拟打印2. Adobe Acrobat中裁剪并另存为eps格式 如何使用Visio绘图然后导出.eps格式的图片呢&#xff1f;这个过程需要用到Adobe Acrobat&#xff0c;使用Adobe Acrobat的虚拟打印功能&#xf…

JVM知识总结(简单且高效)

1. JVM内存与本地内存 JVM内存&#xff1a;受虚拟机内存大小的参数控制&#xff0c;当大小超过参数设置的大小时会报OOM。本地内存&#xff1a;本地内存不受虚拟机内存参数的限制&#xff0c;只受物理内存容量的限制&#xff1b;虽然不受参数的限制&#xff0c;如果所占内存超过…

【Java集合篇】负载因子和容量的关系

负载因子和容量有什么关系 ✔️典型解析✔️loadfactor为啥默认是0.75F&#xff0c;不是1呢?✔️为什么HashMap的默认负载因子设置成0.75✔️0.75的数学依据是什么✔️0.75的必然因素 ✔️HashMap的初始值设为多少合适? ✔️典型解析 HashMap 中有几个属性&#xff0c;如 cap…

商智C店H5性能优化实战

前言 商智C店&#xff0c;是依托移动低码能力搭建的一个应用&#xff0c;产品面向B端商家。随着应用体量持续增大&#xff0c;考虑产品定位及用户体验&#xff0c;我们针对性能较差页面做了一次优化&#xff0c;并取得了不错的效果&#xff0c;用户体验值&#xff08;UEI&…

每日一题——LeetCode1089.复写0

方法一 splice&#xff1a; 通过数组的slice方法&#xff0c;碰到 0就在后面加一个0&#xff0c;最后截取原数组的长度&#xff0c;舍弃后面部分。 但这样做是违反了题目的要求&#xff0c;不要在超过该数组长度的位置写入元素。 var duplicateZeros function(arr) {var le…

docker 完成MySQL的主从复制

文章目录 搭建步骤 搭建步骤 拉取镜像 docker pull mysql:5.7运行主从 docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_P…

Springboot进行多环境配置的2种方式

本文来说下Springboot使用Spring Profile和Maven Profile进行多环境配置 文章目录 概述Spring Profile多环境主配置文件与不同环境的配置文件 Maven ProfileProfile配置资源过滤 Spring Profile与Maven Profile具体使用 概述 原因 在实际的项目上&#xff0c;一般会分三种环境d…

淘宝商品详情API接口(item_get-获得淘宝商品详情)主图,属性,sku,价格,搜索商品列表

淘宝开放平台提供了API接口&#xff0c;允许开发者获取淘宝商品的相关信息。为了获取商品详情&#xff0c;您可以使用 item_get API接口。以下是如何使用此API接口来获取商品的主图、属性、SKU、价格以及搜索商品列表的简要说明&#xff1a; 公共参数 名称类型必须描述keyStr…

如何利用MiniTab的命令行来提高数据建模效率

使用MiniTab进行数据建模时&#xff0c;如果涉及到需要多次更改数据、多次查看模型&#xff0c;感兴趣的同学可以尝试一下&#xff0c;把命令行显示出来&#xff0c;通过命令行的形式来执行&#xff0c;避免在繁多的菜单中到处查找。 操作方式如下图&#xff1a; 点击菜单“查…

Transformer架构和对照代码详解

1、英文架构图 下面图中展示了Transformer的英文架构&#xff0c;英文架构中的模块名称和具体代码一一对应&#xff0c;方便大家对照代码、理解和使用。 2、编码器 2.1 编码器介绍 从宏观⻆度来看&#xff0c;Transformer的编码器是由多个相同的层叠加⽽ 成的&#xff0c;每个…

Java重修第三天—“方法“的案例练习

案例一&#xff1a;买飞机票 题目 用户购买机票时&#xff0c;机票原价会按照淡季、旺季&#xff0c;头等舱还是经济舱的情况进行相应的优惠&#xff0c;优惠方案如下:5-10月为旺季&#xff0c;头等舱9折&#xff0c;经济舱8.5折。11月到来年4月为淡季&#xff0c;头等舱7折&…

内核线程创建-kthread_create

文章参考Linux内核线程kernel thread详解 - 知乎 大概意思就是早期创建内核线程&#xff0c;是交由内核处理&#xff0c;由内核自己完成&#xff08;感觉好像也不太对呢&#xff09;&#xff0c;创建一个内核线程比较麻烦&#xff0c;会导致内核阻塞。因此就诞生了工作队列以及…

美格智能5G RedCap模组SRM813Q通过广东联通5G创新实验室测试认证

近日&#xff0c;美格智能5G RedCap轻量化模组SRM813Q正式通过广东联通5G创新实验室端到端的测试验收&#xff0c;获颁测评证书。美格智能已连续通过业内两家权威实验室的测试认证&#xff0c;充分验证SRM813Q系列模组已经具备了成熟的商用能力&#xff0c;将为智慧工业、安防监…

docker - 常用容器部署命令大全(MySQL、Redis、RabbitMQ、ES、Kibana、Nacos、Sentinel)

目录 一、常用容器运行指令 MySQL Redis RabbitMQ ElasticSearch & kibana Nacos Sentinel 一、常用容器运行指令 MySQL docker run -d --name mysql -p 3306:3306 -e TZAsia/Shanghai -e MYSQL_ROOT_PASSWORD1111 mysql:5.7 -e TZAsia/Shanghai&#xff1a;指定…

听GPT 讲Rust源代码--compiler(26)

File: rust/compiler/rustc_target/src/abi/call/mips.rs 在Rust源代码中的rust/compiler/rustc_target/src/abi/call/mips.rs文件是关于MIPS架构的函数调用ABI(Aplication Binary Interface)定义。ABI是编程语言与底层平台之间的接口规范&#xff0c;用于定义函数调用、参数传…

centos7部署minio单机版

一、目标 在centos7上部署minio单机版 二、centos7部署minio 1、下载minio mkdir /usr/local/minio cd /usr/local/minio wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio 2、新建minio存储数据的目录 mkdir -p /data/minio/data3、新建…

首次引入大模型!Bert-vits2-Extra中文特化版40秒素材复刻巫师3叶奈法

Bert-vits2项目又更新了&#xff0c;更新了一个新的分支&#xff1a;中文特化&#xff0c;所谓中文特化&#xff0c;即针对中文音色的特殊优化版本&#xff0c;纯中文底模效果百尺竿头更进一步&#xff0c;同时首次引入了大模型&#xff0c;使用国产IDEA-CCNL/Erlangshen-Megat…
最新文章