MP3️⃣进阶①DQL:条件构造器

Wrapper:条件构造器

条件构造器:封装了复杂的 SQL 查询条件。

通过编程的方式,自动拼接 SQL 查询条件,且支持链式编程

  • QueryWrapper:构建查询条件

  • LambdaQueryWrapper:支持 lambda 形式

    image-20220522170159203

1、基本条件

  • 等值:eq(),ne()
  • 包含:in()
  • 模糊:like()
  • 范围
    • 大于:gt()
    • 大于等于:ge()
    • 小于:lt()
    • 小于等于:lte()
    • 区间:between(),左右包含

1.1、等值

eq()ne()

示例:以 eq() 为例,模拟登录用户验证。

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();

wrapper.eq(User::getName, "admin")
    .eq(User::getPassword, "admin");

userDao.selectOne(wrapper);

1.2、包含

in()

示例:查询指定年龄的用户。

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();

wrapper.in(User::getAge, 18, 20);

List<User> userList = userDao.selectList(wrapper);
System.out.println(userList);

1.3、模糊

  • like():前后拼接 %
  • likeRight():后拼接 %
  • likeLeft():前拼接 %

示例:查询 name 以 J 开头,e 结尾的用户。

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>();
wrapper.likeRight(User::getName, "J")
    .likeLeft(User::getName, "e");

List<User> userList = userDao.selectList(wrapper);
System.out.println(userList);

1.4、范围

示例:查询年龄在 [18, 30] 区间的用户。

  • lt()gt()

    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.ge(User::getAge, 18)
            .lte(User::getAge, 30);
    
    userDao.selectList(wrapper);
    
  • between()建议

    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.between(User::getAge, 18, 30);
    
    userDao.selectList(wrapper);
    

2、逻辑

2.1、判空

  • Wrapper 可以定义属性筛选规则,拼接 SQL 查询条件。

  • 而实际上 entity 中的该属性可能并没有被赋值,即为 null。

  • 以 LeetCode 为例,筛选条件可选可不选。

  • 此时,需要判断相应属性非 null,才进行条件拼接。

    image-20220522174609601

模拟需求

示例:根据用户输入(可 null),查询指定年龄区间的用户。

  1. 定义 UserQuery(继承 User),用于接收 age 和 maxAge。

    @Data
    public class UserQuery extends User {
        private int maxAge;
    }
    
  2. 调用 lt()gt() 重载方法,首个参数(Condition)为 true 才拼接。

    void test(UserQuery userQuery) {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    
        wrapper.gt(null != userQuery.getAge(), User::getAge, userQuery.getAge())
            .lt(null != userQuery.getAge(), User::getAge, userQuery.getMaxAge());
    
        userDao.selectList(wrapper);
    }
    

2.2、拼接子句(and/or)

  • and:年龄在 18-30 之间

    // 无需额外操作
    wrapper.gt(User::getAge, 18)
        	.lt(User::getAge, 30);
    
  • or:年龄在 18 和 30 之外

    // 添加 or() 方法
    wrapper.lt(User::getAge, 18)
        	.or()
        	.gt(User::getAge, 30);
    

3、查询投影

默认情况下,MP 查询结果包含数据库表的所有字段SELECT *

查询投影:只查询出指定内容。

3.1、指定字段

调用 select() 筛选指定列

  • QueryWrapper:指定字段名

    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.select("name", "age");
    
    userDao.selectList(wrapper);
    
  • LambdaQueryWrapper:方法引用

    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper1.select(User::getName, User::getAge);
    
    userDao.selectList(wrapper);
    

3.2、聚合函数

调用 QueryWrapper 的 select(),指定聚合函数。

调用 BaseMapper 的 selectMaps,存储返回值。

  • COUNT

  • SUM

  • MAX

  • MIN

  • AVG

    QueryWrapper<User> wrapper = new QueryWrapper<>();
    // wrapper.select("COUNT(*)");
    // wrapper.select("SUM(age)");
    // wrapper.select("MAX(age)");
    // wrapper.select("MIN(age)");
    // wrapper.select("AVG(age)");
    userDao.selectMaps(wrapper);
    

3.3、分组查询

示例:查询每个名字对应的人数。

QueryWrapper<User> wrapper = new QueryWrapper<>();

wrapper.select("name, COUNT(*)");
wrapper.groupBy("name");

userDao.selectMaps(wrapper);

3.4、排序查询

示例:按年龄升序,按 id 降序

Hint:参数(是否排序,是否升序,操作列)

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.orderBy(true, true, User::getAge)
    .orderBy(true, false, User::getId);

userDao.selectList(wrapper);
posted @ 2022-05-22 22:31  Jaywee  阅读(98)  评论(0编辑  收藏  举报

👇