MyBatis-Plus的条件构造器Wrapper是封装查询条件的核心组件,支持通过链式编程的方式灵活拼接各类查询条件,无需手动编写SQL语句即可完成复杂查询逻辑的构建。它提供了QueryWrapper、UpdateWrapper等多个实现类,分别对应查询、更新等不同场景的条件构造需求。

Wrapper基础概念与核心类
Wrapper是所有条件构造器的父类,常用的子类主要有两类:QueryWrapper用于构建查询条件,UpdateWrapper用于构建更新条件。两者都支持链式调用,每个条件方法都会返回当前Wrapper实例,方便连续拼接条件。
核心条件方法包括:
eq:等于条件ne:不等于条件gt:大于条件lt:小于条件like:模糊查询条件between:范围查询条件and:拼接与条件or:拼接或条件
基础链式查询示例
假设我们有一个用户表对应的实体类User,包含id、name、age、email四个字段,现在需要查询年龄大于18且名字包含张的用户数据,使用QueryWrapper的链式编程实现如下:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;
public class WrapperDemo {
// 假设userMapper是已经注入的UserMapper实例
private UserMapper userMapper;
public void basicQuery() {
// 创建QueryWrapper实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 链式拼接条件:年龄大于18 且 名字包含张
queryWrapper.gt("age", 18).like("name", "张");
// 执行查询
List<User> userList = userMapper.selectList(queryWrapper);
// 输出查询结果
userList.forEach(System.out::println);
}
}
复杂条件组合拼接
实际业务中经常会遇到需要组合多个与或条件的场景,比如查询年龄大于18且小于30,或者名字包含李,且邮箱不为空的用户。这时候可以通过and和or方法结合lambda表达式实现复杂的逻辑组合:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;
public class ComplexWrapperDemo {
private UserMapper userMapper;
public void complexQuery() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 拼接复杂条件:(age > 18 AND age < 30) OR (name LIKE '%李%') AND email IS NOT NULL
queryWrapper.and(wrapper -> wrapper.gt("age", 18).lt("age", 30))
.or(wrapper -> wrapper.like("name", "李"))
.isNotNull("email");
List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
}
范围查询与模糊查询结合
如果需要查询创建时间在某个时间段内,且状态为正常的用户,同时名字不包含测试关键词,可以通过以下方式拼接条件:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.time.LocalDateTime;
import java.util.List;
public class RangeQueryDemo {
private UserMapper userMapper;
public void rangeQuery() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 时间范围:2024-01-01到2024-06-30
LocalDateTime startTime = LocalDateTime.of(2024, 1, 1, 0, 0, 0);
LocalDateTime endTime = LocalDateTime.of(2024, 6, 30, 23, 59, 59);
queryWrapper.between("create_time", startTime, endTime)
.eq("status", 1)
.notLike("name", "测试");
List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
}
UpdateWrapper实现更新条件拼接
除了查询场景,UpdateWrapper可以用于构建更新条件,比如将年龄大于30且状态为0的用户状态更新为1,同时更新修改时间:
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import java.time.LocalDateTime;
public class UpdateWrapperDemo {
private UserMapper userMapper;
public void updateWithWrapper() {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// 拼接更新条件:年龄大于30 且 状态为0
updateWrapper.gt("age", 30).eq("status", 0);
// 设置更新内容
User updateUser = new User();
updateUser.setStatus(1);
updateUser.setUpdateTime(LocalDateTime.now());
// 执行更新
int rows = userMapper.update(updateUser, updateWrapper);
System.out.println("更新行数:" + rows);
}
}
使用LambdaWrapper避免字段名硬编码
上面的示例中条件字段都是用字符串硬编码的,容易出现字段名拼写错误的问题,MyBatis-Plus提供了LambdaQueryWrapper和LambdaUpdateWrapper,可以通过方法引用获取字段名,避免硬编码:
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.List;
public class LambdaWrapperDemo {
private UserMapper userMapper;
public void lambdaQuery() {
// 创建LambdaQueryWrapper实例
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 链式拼接条件,通过方法引用获取字段名,避免硬编码
lambdaQueryWrapper.gt(User::getAge, 18)
.like(User::getName, "张")
.eq(User::getStatus, 1);
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
userList.forEach(System.out::println);
}
}
注意事项
使用Wrapper时需要注意几个问题:一是条件拼接的顺序会影响最终生成的SQL逻辑,尤其是and和or的组合需要符合业务逻辑预期;二是如果条件值可能为null,需要先做非空判断,避免拼接无效条件;三是LambdaWrapper虽然避免了硬编码,但无法使用数据库函数相关的条件拼接,此时可以选择普通Wrapper结合常量定义字段名的方式减少错误。
MyBatis_PlusWrapper链式编程复杂查询修改时间:2026-06-18 03:03:21