• [MyBatisPlus]DQL编程控制②(查询投影、查询条件)


    查询投影

    查询指定字段

    目前我们在查询数据的时候,什么都没有做默认就是查询表中所有字段的内容,我们所说的查询投影即不查询所有字段,只查询出指定内容的数据。

    具体如何来实现?

    @SpringBootTest
    class Mybatisplus02DqlApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        @Test
        void testGetAll(){
            LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
            lqw.select(User::getId,User::getName,User::getAge);
            List<User> userList = userDao.selectList(lqw);
            System.out.println(userList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • select(…)方法用来设置查询的字段列,可以设置多个,最终的sql语句为:

      SELECT id,name,age FROM user
      
      • 1
    • 如果使用的不是lambda,就需要手动指定字段

      @SpringBootTest
      class Mybatisplus02DqlApplicationTests {
      
          @Autowired
          private UserDao userDao;
          
          @Test
          void testGetAll(){
              QueryWrapper<User> lqw = new QueryWrapper<User>();
              lqw.select("id","name","age","tel");
              List<User> userList = userDao.selectList(lqw);
              System.out.println(userList);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 最终的sql语句为:SELECT id,name,age,tel FROM user

    聚合查询

    需求:聚合函数查询,完成count、max、min、avg、sum的使用

    count:总记录数

    max:最大值

    min:最小值

    avg:平均值

    sum:求和

    @SpringBootTest
    class Mybatisplus02DqlApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        @Test
        void testGetAll(){
            QueryWrapper<User> lqw = new QueryWrapper<User>();
            //lqw.select("count(*) as count");
            //SELECT count(*) as count FROM user
            //lqw.select("max(age) as maxAge");
            //SELECT max(age) as maxAge FROM user
            //lqw.select("min(age) as minAge");
            //SELECT min(age) as minAge FROM user
            //lqw.select("sum(age) as sumAge");
            //SELECT sum(age) as sumAge FROM user
            lqw.select("avg(age) as avgAge");
            //SELECT avg(age) as avgAge FROM user
            List<Map<String, Object>> userList = userDao.selectMaps(lqw);
            System.out.println(userList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    为了在做结果封装的时候能够更简单,我们将上面的聚合函数都起了个名称,方面后期来获取这些数据

    分组查询

    需求:分组查询,完成 group by的查询使用

    @SpringBootTest
    class Mybatisplus02DqlApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        @Test
        void testGetAll(){
            QueryWrapper<User> lqw = new QueryWrapper<User>();
            lqw.select("count(*) as count,tel");
            lqw.groupBy("tel");
            List<Map<String, Object>> list = userDao.selectMaps(lqw);
            System.out.println(list);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • groupBy为分组,最终的sql语句为

      SELECT count(*) as count,tel FROM user GROUP BY tel
      
      • 1

    注意:

    • 聚合与分组查询,无法使用lambda表达式来完成
    • MP只是对MyBatis的增强,如果MP实现不了,我们可以直接在DAO接口中使用MyBatis的方式实现

    查询条件

    前面我们只使用了lt()和gt(),除了这两个方法外,MP还封装了很多条件对应的方法,这一节我们重点把MP提供的查询条件方法进行学习下。

    MP的查询条件有很多:

    • 范围匹配(> 、 = 、between)
    • 模糊匹配(like)
    • 空判定(null)
    • 包含性匹配(in)
    • 分组(group)
    • 排序(order)
    • ……

    等值查询

    需求:根据用户名和密码查询用户信息

    @SpringBootTest
    class Mybatisplus02DqlApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        @Test
        void testGetAll(){
            LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
            lqw.eq(User::getName, "Jerry").eq(User::getPassword, "jerry");
            User loginUser = userDao.selectOne(lqw);
            System.out.println(loginUser);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • eq(): 相当于 =,对应的sql语句为

      SELECT id,name,password,age,tel FROM user WHERE (name = ? AND password = ?)
      
      • 1
    • selectList:查询结果为多个或者单个

    • selectOne:查询结果为单个

    范围查询

    需求:对年龄进行范围查询,使用lt()、le()、gt()、ge()、between()进行范围查询

    @SpringBootTest
    class Mybatisplus02DqlApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        @Test
        void testGetAll(){
            LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
            lqw.between(User::getAge, 10, 30);
            //SELECT id,name,password,age,tel FROM user WHERE (age BETWEEN ? AND ?)
            List<User> userList = userDao.selectList(lqw);
            System.out.println(userList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • gt():大于(>)
    • ge():大于等于(>=)
    • lt():小于(<)
    • lte():小于等于(<=)
    • between():between ? and ?

    模糊查询

    需求:查询表中name属性的值以J开头的用户信息,使用like进行模糊查询

    @SpringBootTest
    class Mybatisplus02DqlApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        @Test
        void testGetAll(){
            LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
            lqw.likeLeft(User::getName, "J");
            //SELECT id,name,password,age,tel FROM user WHERE (name LIKE ?)
            List<User> userList = userDao.selectList(lqw);
            System.out.println(userList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • like():前后加百分号,如 %J%
    • likeLeft():前面加百分号,如 %J
    • likeRight():后面加百分号,如 J%

    排序查询

    需求:查询所有数据,然后按照id降序

    @SpringBootTest
    class Mybatisplus02DqlApplicationTests {
    
        @Autowired
        private UserDao userDao;
        
        @Test
        void testGetAll(){
            LambdaQueryWrapper<User> lwq = new LambdaQueryWrapper<>();
            /**
             * condition :条件,返回boolean,
             		当condition为true,进行排序,如果为false,则不排序
             * isAsc:是否为升序,true为升序,false为降序
             * columns:需要操作的列
             */
            lwq.orderBy(true,false, User::getId);
    
            userDao.selectList(lw
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    除了上面演示的这种实现方式,还有很多其他的排序方法可以被调用,如图:

    在这里插入图片描述

    • orderBy排序
      • condition:条件,true则添加排序,false则不添加排序
      • isAsc:是否为升序,true升序,false降序
      • columns:排序字段,可以有多个
    • orderByAsc/Desc(单个column):按照指定字段进行升序/降序
    • orderByAsc/Desc(多个column):按照多个字段进行升序/降序
    • orderByAsc/Desc
      • condition:条件,true添加排序,false不添加排序
      • 多个columns:按照多个字段进行排序

    除了上面介绍的这几种查询条件构建方法以外还会有很多其他的方法,比如isNull,isNotNull,in,notIn等等方法可供选择,具体参考官方文档的条件构造器来学习使用,具体的网址为:
    https://mp.baomidou.com/guide/wrapper.html#abstractwrapper
    在这里插入图片描述

  • 相关阅读:
    phpinfo中的重要信息
    修改了windows dns配置,在wsl2中不生效
    51单片机直流电机控制
    Learn Dijkstra For The Last Time
    论文笔记 - SIMILAR: Submodular Information Measures Based Active Learning In Realistic Scenarios
    MapReduce 机理
    RocketMQ源码分析(十)之MappedFileQueue
    FRPC+PHP+MYSQL+APACHE2=个人网站
    力扣刷题:寻找两个正序数组的中位数、最长回文子串
    小红书2022上半年品牌营销数据报告
  • 原文地址:https://blog.csdn.net/zyb18507175502/article/details/126038436