注意⚠️
Wrapper类是 MyBatis-Plus 提供的工具类,必须与继承了BaseMapper的接口配合使用。
作用
Wrapper 是 MyBatis-Plus 提供的 条件构造器工具类,用于构建复杂的数据库查询条件。
它的作用是简化 SQL 条件构造,但它不能替代 Mapper 层。最终仍需通过 Mapper 接口的方法(如 selectList、selectOne 等)执行数据库操作。
它不涉及 SQL 的执行逻辑(如连接数据库、设置参数、返回结果映射等),这些仍由 Mapper 层负责。
构成
| QueryWrapper (LambdaQueryWrapper) | 用于构造查询条件,如:select、delete 中的 where |
| UpdateWrapper(LambdaUpdateWrapper) | 用于构造更新条件, 如:update 中的 set + where |
| AbstractWrapper | 上面所有wrapper的父类 |
| 操作类型 | 核心需求 | 是否需要 Wrapper | 示例 |
|---|---|---|---|
| 新增 | 设置字段值 | 否 | userMapper.insert(user) |
| 查询 | 构造 WHERE 条件 | 是 | userMapper.selectList(new QueryWrapper<User>().eq("name", "张三")) |
| 更新 | 设置 SET 字段 + WHERE 条件 | 部分需要 | userMapper.update(user, new UpdateWrapper<User>().eq("id", 1)) |
| 删除 | 构造 WHERE 条件 | 是 | userMapper.delete(new QueryWrapper<User>().eq("id", 1)) |
示例代码
QueryWrapper
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq("status", 1)
.like("name", "张")
.gt("age", 18)
.orderByDesc("create_time")
.last("LIMIT 10"); // 拼接原生 SQL
List<User> users = userMapper.selectList(queryWrapper);
LambdaUpdateWrapper
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper
.set(User::getStatus, 0)
.set(User::getUpdateTime, LocalDateTime.now())
.eq(User::getId, 1)
.or()
.lt(User::getAge, 18);
userMapper.update(null, updateWrapper);
语法详解
一、基础条件构造
1. 等值查询(=)
eq (String column, Object val) // = 等于
// 示例:WHERE name = '张三'
queryWrapper.eq("name", "张三");
2. 非等值查询(!=、>、< 等)
ne(String column, Object val) // !=
gt(String column, Object val) // >
ge(String column, Object val) // >=
lt(String column, Object val) // <
le(String column, Object val) // <=
// 示例:WHERE age > 18 AND salary <= 10000
queryWrapper.gt("age", 18).le("salary", 10000);
3. 模糊查询(LIKE)
like (String column, Object val) // LIKE '%值%'
likeLeft (String column, Object val) // LIKE '%值'
likeRight (String column, Object val) // LIKE '值%'
notLike (String column, Object val)
notLikeLeft (String column, Object val)
notLikeRight (String column, Object val)
// 示例:WHERE email LIKE '%@gmail.com'
queryWrapper.likeRight("email", "@gmail.com");
4. IN 查询
in(String column, Collection<?> values) // IN (v1, v2, ...)
in(String column, Object... values) // 可变参数版本
// 示例:WHERE id IN (1, 2, 3)
queryWrapper.in("id", Arrays.asList(1, 2, 3));
5. NULL 判断
isNull(String column) // IS NULL
isNotNull(String column) // IS NOT NULL
// 示例:WHERE create_time IS NULL
queryWrapper.isNull("create_time");
6. 范围查询(BETWEEN)
between (String column, Object val1, Object val2) // BETWEEN val1 AND val2
notBetween(String column, Object val1, Object val2) // NOT BETWEEN val1 AND val2
// 示例:WHERE age BETWEEN 18 AND 30
queryWrapper.between("age", 18, 30);
二、逻辑组合(AND、OR、括号)
1. AND 连接(默认)
// 多个条件默认用 AND 连接
queryWrapper.eq("name", "张三").gt("age", 18);
// 等价于:WHERE name = '张三' AND age > 18
2. OR 连接
or()
or(Consumer<Param> consumer) // 带括号的 OR
// 示例:WHERE name = '张三' OR age > 18
queryWrapper.eq("name", "张三").or().gt("age", 18);
// 示例:WHERE name = '张三' OR (age > 18 AND gender = 1)
queryWrapper.eq("name", "张三").or(w -> w.gt("age", 18).eq("gender", 1));
3. 括号分组
nested(Consumer<Param> consumer) // 嵌套括号
// 示例:WHERE (name = '张三' OR name = '李四') AND age > 18
queryWrapper.nested(w -> w.eq("name", "张三").or().eq("name", "李四")).gt("age", 18);
三、排序(ORDER BY)
OrderBy(boolean condition, boolean isAsc, String... columns)
// 参数说明:(是否应用这个排序条件,是否升序,排序的字段名(可以是多个))
// 示例:
queryWrapper.orderBy(true, true, "id", "name");
orderByAsc(String... columns) // 升序
orderByDesc(String... columns) // 降序
// 示例:ORDER BY create_time DESC, id ASC
queryWrapper.orderByDesc("create_time").orderByAsc("id");
四、 分组 (GROUP BY)
// 设置分组条件,使用字段名
groupBy (R... columns)
// 示例:
queryWrapper.groupBy("id", "name");
五、 分页(配合 Page 对象)
// 需配合 IPage 接口使用
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
IPage<User> result = userMapper.selectPage(page, queryWrapper);
六、UpdateWrapper 特有的 SET 方法
set(String column, Object val) // 设置更新字段
setSql(String sql) // 设置原生 SQL
// 示例:UPDATE user SET name = '李四', age = 20 WHERE id = 1
updateWrapper.set("name", "李四").set("age", 20).eq("id", 1);
七、其他
1. 条件动态化(避免 NULL 条件)
eq(boolean condition, String column, Object val)
// 示例:当 name 不为 null 时才添加条件
queryWrapper.eq(name != null, "name", name);
2. 查询指定字段(SELECT)
select(String... columns) // 查询指定字段
// 示例:SELECT id, name FROM user
queryWrapper.select("id", "name");
3. 子查询
exists(String sql) // EXISTS (subquery)
notExists(String sql) // NOT EXISTS (subquery)
inSql(String column, String inValue) // IN (subquery)
// 示例:WHERE EXISTS (SELECT 1 FROM order WHERE order.user_id = user.id)
queryWrapper.exists("SELECT 1 FROM order WHERE order.user_id = user.id");
4446

被折叠的 条评论
为什么被折叠?



