源本科技 | 码上会

条件构造器

2026/04/02
0
0

什么是条件构造器

条件构造器(Wrapper) 是 MyBatis Plus 提供的 SQL 条件拼装工具,用于通过 Java 链式 API 构建 WHERE 条件、查询字段、排序、分组、更新字段等,无需手写 XML/ 注解 SQL,实现类型安全、无硬编码的单表操作。

核心价值:

  • 替代传统 WHERE 条件,代码更优雅

  • 支持 Lambda 表达式,避免字段名硬编码

  • 动态条件友好,简化复杂业务判断

  • 与 MP 的 Mapper/Service 完美兼容

核心体系

MP 条件构造器基于继承体系设计,常用类只有 5 个,记忆成本极低:

Wrapper(顶层抽象)
└── AbstractWrapper(条件抽象父类)
    ├── QueryWrapper(查询条件构造器)
    └── UpdateWrapper(更新条件构造器)
        ├── LambdaQueryWrapper(Lambda 查询构造器,推荐)
        └── LambdaUpdateWrapper(Lambda 更新构造器,推荐)

核心分类

类名

用途

特点

QueryWrapper

普通查询条件

字段名用字符串,存在硬编码风险

UpdateWrapper

普通更新 / 删除条件

支持 set() 手动指定更新字段

LambdaQueryWrapper

Lambda 查询

实体::get 字段,编译期检查,无硬编码

LambdaUpdateWrapper

Lambda 更新 / 删除

企业开发首选,安全高效

基础使用

普通条件构造器

字符串字段名

// 1. 查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 20)        // 年龄 = 20
            .like("username", "张")// 用户名含张
            .between("id", 1, 10);// ID 在 1~10 之间
List<User> userList = userMapper.selectList(queryWrapper);

// 2. 更新条件
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("status", 1)    // 设置 status = 1
             .eq("id", 1L);       // 条件 ID = 1
userMapper.update(null, updateWrapper);

Lambda 构造器

推荐,解决字符串硬编码问题,支持编译期校验,字段修改自动提示

// Lambda 查询
LambdaQueryWrapper<User> lambdaQuery = Wrappers.lambdaQuery(User.class)
        .eq(User::getAge, 20)
        .like(User::getUsername, "张")
        .between(User::getId, 1, 10);
List<User> userList = userMapper.selectList(lambdaQuery);

// Lambda 更新
LambdaUpdateWrapper<User> lambdaUpdate = Wrappers.lambdaUpdate(User.class)
        .set(User::getStatus, 1)
        .eq(User::getId, 1L);
userMapper.update(null, lambdaUpdate);

快速创建

Wrappers 工具类

// 一行创建 Lambda 查询构造器
Wrappers.lambdaQuery(User.class)
Wrappers.lambdaUpdate(User.class)

常用方法

所有方法均支持链式调用,格式:方法(条件, 字段, 值)

等值/不等值

  • eq():等于(=

  • ne():不等于(!=

lambdaQuery.eq(User::getSex, 1)
           .ne(User::getDelFlag, 1);

大于/小于

  • gt():大于(>

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

  • lt():小于(<

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

lambdaQuery.gt(User::getAge, 18)
           .le(User::getAge, 60);

模糊查询

  • like():全模糊(%值%

  • likeLeft():左模糊(%值

  • likeRight():右模糊(值%推荐,走索引

  • notLike():不包含

lambdaQuery.likeRight(User::getUsername, "张"); // 张%

范围查询

  • between:区间(BETWEEN A AND B

  • notBetween:不在区间

  • in:包含(IN()

  • notIn:不包含

lambdaQuery.between(User::getAge, 18, 30)
           .in(User::getDeptId, Arrays.asList(1, 2, 3));

空值判断

  • isNull():字段为 NULL

  • isNotNull():字段不为 NULL

lambdaQuery.isNull(User::getEmail);

排序

  • orderByAsc():升序

  • orderByDesc():降序

lambdaQuery.orderByDesc(User::getCreateTime)
           .orderByAsc(User::getAge);

动态条件构建

MP 提供condition 参数的重载方法,满足条件才拼接 SQL,避免大量 if-else

格式: 方法(condition, 字段, 值)

// 前端传参:姓名、年龄、状态
String username = "张";
Integer age = null;
Integer status = 1;

LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class)
        // 姓名不为空才拼接 like 条件
        .like(StringUtils.hasText(username), User::getUsername, username)
        // 年龄不为空才拼接 eq
        .eq(age != null, User::getAge, age)
        // 状态不为空才拼接 eq
        .eq(status != null, User::getStatus, status);

查询字段控制

默认查询所有字段,可通过 select() 指定查询列,提升查询性能

// 只查询 id、username、age
Wrappers.lambdaQuery(User.class)
        .select(User::getId, User::getUsername, User::getAge)
        .eq(User::getStatus, 1);

逻辑构造

MP 默认所有条件用 AND 连接,可手动使用 or()and() 构建复杂逻辑。

基础 OR

// 年龄 = 20 OR 状态 = 1
lambdaQuery.eq(User::getAge, 20)
           .or()
           .eq(User::getStatus, 1);

嵌套 OR

括号分组

// 状态 = 1 AND (年龄 = 20 OR 年龄 = 30)
lambdaQuery.eq(User::getStatus, 1)
           .and(w -> w.eq(User::getAge, 20).or().eq(User::getAge, 30));

配合 Service/Chain/Db Kit

Service

List<User> list = userService.list(Wrappers.lambdaQuery(User.class)
        .eq(User::getStatus, 1));

Chain

List<User> list = userService.lambdaQuery()
        .eq(User::getStatus, 1)
        .list();

Db Kit

静态调用

List<User> list = Db.lambdaQuery(User.class)
        .eq(User::getStatus, 1)
        .list();

注意事项

  1. Lambda 构造器优先使用 避免字符串硬编码,支持重构、编译检查。

  2. 严禁无条件更新 / 删除 不加 eq() 会更新 / 删除全表,生产环境严禁使用。

  3. 逻辑删除自动生效 配置 @TableLogic 后,条件构造器自动拼接 del_flag = 0

  4. 只支持单表操作 多表联查必须手写 XML/ 自定义 SQL。

  5. 性能优化select() 指定字段、likeRight 走索引、避免全表扫描。

总结

  1. 条件构造器是 MP 单表操作核心,彻底替代手写 WHERE 条件。

  2. 优先使用 LambdaQueryWrapper/LambdaUpdateWrapper,安全无硬编码。

  3. 掌握动态条件嵌套逻辑字段过滤三大核心技能。

  4. 可配合 Service、Chain、Db Kit 使用,适配所有开发场景。

  5. 遵循规范,避免全表操作,保证生产环境安全。