写点什么

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

作者:fake smile by
  • 2022 年 9 月 15 日
    黑龙江
  • 本文字数:2943 字

    阅读完需:约 10 分钟

查询投影

查询指定字段

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


具体如何来实现?


@SpringBootTestclass 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); }}
复制代码


  • select(...)方法用来设置查询的字段列,可以设置多个,最终的 sql 语句为:


  SELECT id,name,age FROM user
复制代码


  • 如果使用的不是 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);      }  }
复制代码


  • 最终的 sql 语句为:SELECT id,name,age,tel FROM user

聚合查询

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

count:总记录数

max:最大值

min:最小值

avg:平均值

sum:求和


@SpringBootTestclass 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); }}
复制代码


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

分组查询

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


@SpringBootTestclass 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); }}
复制代码


  • groupBy 为分组,最终的 sql 语句为


  SELECT count(*) as count,tel FROM user GROUP BY tel
复制代码


注意:


  • 聚合与分组查询,无法使用 lambda 表达式来完成

  • MP 只是对 MyBatis 的增强,如果 MP 实现不了,我们可以直接在 DAO 接口中使用 MyBatis 的方式实现

查询条件

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


MP 的查询条件有很多:


  • 范围匹配(> 、 = 、between)

  • 模糊匹配(like)

  • 空判定(null)

  • 包含性匹配(in)

  • 分组(group)

  • 排序(order)

  • ……

等值查询

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


@SpringBootTestclass 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); }}
复制代码


  • eq(): 相当于 =,对应的 sql 语句为


  SELECT id,name,password,age,tel FROM user WHERE (name = ? AND password = ?)
复制代码


  • selectList:查询结果为多个或者单个

  • selectOne:查询结果为单个

范围查询

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


@SpringBootTestclass 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); }}
复制代码


  • gt():大于(>)

  • ge():大于等于(>=)

  • lt():小于(<)

  • lte():小于等于(<=)

  • between():between ? and ?

模糊查询

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


@SpringBootTestclass 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); }}
复制代码


  • like():前后加百分号,如 %J%

  • likeLeft():前面加百分号,如 %J

  • likeRight():后面加百分号,如 J%

排序查询

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


@SpringBootTestclass 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 }}
复制代码


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



  • 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

发布于: 刚刚阅读数: 6
用户头像

fake smile by

关注

还未添加个人签名 2022.07.31 加入

还未添加个人简介

评论

发布
暂无评论
[MyBatisPlus]DQL编程控制②(查询投影、查询条件)_Java_fake smile by_InfoQ写作社区