条件构造器(Wrapper) 是 MyBatis Plus 提供的 SQL 条件拼装工具,用于通过 Java 链式 API 构建 WHERE 条件、查询字段、排序、分组、更新字段等,无需手写 XML/ 注解 SQL,实现类型安全、无硬编码的单表操作。
核心价值:
替代传统 WHERE 条件,代码更优雅
支持 Lambda 表达式,避免字段名硬编码
动态条件友好,简化复杂业务判断
与 MP 的 Mapper/Service 完美兼容
MP 条件构造器基于继承体系设计,常用类只有 5 个,记忆成本极低:
Wrapper(顶层抽象)
└── AbstractWrapper(条件抽象父类)
├── QueryWrapper(查询条件构造器)
└── UpdateWrapper(更新条件构造器)
├── LambdaQueryWrapper(Lambda 查询构造器,推荐)
└── 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 查询
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() 构建复杂逻辑。
// 年龄 = 20 OR 状态 = 1
lambdaQuery.eq(User::getAge, 20)
.or()
.eq(User::getStatus, 1);括号分组
// 状态 = 1 AND (年龄 = 20 OR 年龄 = 30)
lambdaQuery.eq(User::getStatus, 1)
.and(w -> w.eq(User::getAge, 20).or().eq(User::getAge, 30));List<User> list = userService.list(Wrappers.lambdaQuery(User.class)
.eq(User::getStatus, 1));List<User> list = userService.lambdaQuery()
.eq(User::getStatus, 1)
.list();静态调用
List<User> list = Db.lambdaQuery(User.class)
.eq(User::getStatus, 1)
.list();Lambda 构造器优先使用 避免字符串硬编码,支持重构、编译检查。
严禁无条件更新 / 删除 不加 eq() 会更新 / 删除全表,生产环境严禁使用。
逻辑删除自动生效 配置 @TableLogic 后,条件构造器自动拼接 del_flag = 0。
只支持单表操作 多表联查必须手写 XML/ 自定义 SQL。
性能优化 用 select() 指定字段、likeRight 走索引、避免全表扫描。
条件构造器是 MP 单表操作核心,彻底替代手写 WHERE 条件。
优先使用 LambdaQueryWrapper/LambdaUpdateWrapper,安全无硬编码。
掌握动态条件、嵌套逻辑、字段过滤三大核心技能。
可配合 Service、Chain、Db Kit 使用,适配所有开发场景。
遵循规范,避免全表操作,保证生产环境安全。