MyBatis-Plus条件构造器queryWrapper学习

关于 MyBatis-Plus 条件构造器 QueryWrapper


1. QueryWrapper 是什么?

QueryWrapper 是 MyBatis-Plus 提供的一个工具类,用于通过 Java 代码动态构建 SQL 查询条件,避免手写 SQL 字符串。它的核心作用是 简化条件查询的编写,提高代码可读性和维护性。


2. 基础用法示例

假设有一个 User 表,字段包括 idnameageemail

(1) 等值查询

查询 name 为 "张三" 的用户:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");
List<User> userList = userMapper.selectList(queryWrapper);

生成的 SQL:

SELECT * FROM user WHERE name = '张三';

(2) 范围查询

查询 age 在 20 到 30 之间的用户:

queryWrapper.between("age", 20, 30);
List<User> userList = userMapper.selectList(queryWrapper);

生成的 SQL:

SELECT * FROM user WHERE age BETWEEN 20 AND 30;

(3) 模糊查询

查询 name 包含 "张" 的用户:

queryWrapper.like("name", "张");
List<User> userList = userMapper.selectList(queryWrapper);

生成的 SQL:

SELECT * FROM user WHERE name LIKE '%张%';

3. 链式调用

QueryWrapper 支持链式调用,使代码更简洁:

List<User> userList = userMapper.selectList(
    new QueryWrapper<User>()
        .eq("age", 25)
        .like("email", "@gmail.com")
        .orderByDesc("id")
);

生成的 SQL:

SELECT * FROM user 
WHERE age = 25 AND email LIKE '%@gmail.com%' 
ORDER BY id DESC;

4. 复杂条件组合

(1) AND 条件

查询 age > 20 email 不为空的用户:

queryWrapper.gt("age", 20)
            .isNotNull("email");

(2) OR 条件

查询 name 为 "张三" age < 18 的用户:

queryWrapper.eq("name", "张三")
            .or()
            .lt("age", 18);

生成的 SQL:

SELECT * FROM user WHERE name = '张三' OR age < 18;

5. 动态条件构建

根据业务逻辑动态添加条件(如前端筛选表单):

public List<User> searchUsers(String name, Integer minAge) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    if (name != null && !name.isEmpty()) {
        queryWrapper.like("name", name);
    }
    if (minAge != null) {
        queryWrapper.ge("age", minAge);
    }
    return userMapper.selectList(queryWrapper);
}
  • 调用示例:
    List<User> users1 = searchUsers("张", 20); // 查询 name含"张"且 age>=20
    List<User> users2 = searchUsers(null, 18); // 仅查询 age>=18
    

6. 使用 Lambda 表达式

通过 LambdaQueryWrapper 避免字段名硬编码(更安全):

LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getName, "张三")
           .ge(User::getAge, 20);
List<User> userList = userMapper.selectList(lambdaQuery);

生成的 SQL:

SELECT * FROM user WHERE name = '张三' AND age >= 20;

7. 常用方法总结

方法名 作用 示例
eq 等于 = .eq("name", "张三")
ne 不等于 <> .ne("status", 0)
gt 大于 > .gt("age", 18)
ge 大于等于 >= .ge("score", 60)
lt 小于 < .lt("price", 100)
le 小于等于 <= .le("count", 10)
between 范围 BETWEEN .between("age", 20, 30)
like 模糊查询 LIKE '%值%' .like("name", "张")
in 包含 IN (v1, v2) .in("id", Arrays.asList(1, 2))
orderByAsc 升序排序 ORDER BY .orderByAsc("age")
groupBy 分组 GROUP BY .groupBy("department")

8. 最佳实践

  1. 优先使用 LambdaQueryWrapper:避免字段名硬编码,提高代码安全性和可维护性。
  2. 动态条件时判空:避免传入 null 导致 SQL 异常。
  3. 结合分页插件使用
    Page<User> page = new Page<>(1, 10); // 第1页,每页10条
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.ge("age", 18);
    IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
    

9. 层级关系

在上面的图片中,

Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作

9. 常用方法对照表及其案例

QueryWrapper的方法:

通过 QueryWrapper,你可以用 Java 代码轻松构建复杂的 SQL 查询条件,让数据库操作更加高效和安全!

posted @ 2025-03-26 17:15  大沐沐沐  阅读(450)  评论(0)    收藏  举报