目录
[7 条件构造器](#7 条件构造器)
[7.1 条件构造器介绍](#7.1 条件构造器介绍)
[7.2 常用方法](#7.2 常用方法)
[7.3 UpdateWrapper](#7.3 UpdateWrapper)
7 条件构造器
7.1 条件构造器介绍

- Wrapper : 条件构造抽象类,是整个条件构造器的最顶端父类,定义了条件构造的基础规范。
- AbstractWrapper : 所有条件构造器的父类,用于封装查询 / 更新的条件,生成 SQL 的 WHERE 子句(支持eq、like等条件拼接)。
- QueryWrapper : 专门用于构造查询 / 删除操作的条件(对应SELECT/DELETE语句的WHERE子句)。
- UpdateWrapper : 专门用于构造更新操作的条件(对应UPDATE语句的SET和WHERE子句,支持直接通过set方法设置更新字段)。
- AbstractLambdaWrapper : Lambda 风格条件构造器的父类,支持通过实体类的方法引用(如User::getName)指定字段,避免硬编码字段名。
- LambdaQueryWrapper :Lambda 风格的查询 / 删除条件构造器(基于AbstractLambdaWrapper,功能同QueryWrapper,但用 Lambda 指定字段)。
- LambdaUpdateWrapper : Lambda 风格的更新条件构造器(基于AbstractLambdaWrapper,功能同UpdateWrapper,但用 Lambda 指定字段)。
注:MybatisPlus提供的带有条件构造器的内置方法,入参类型都是Wrapper,说明只要是Wrapper的子类都可以作为入参。
7.2 常用方法
- QueryWrapper常用方法(含 condition 参数)
| 方法示例 | 对应 SQL | 说明 | condition 参数用法 |
|---|---|---|---|
eq(R column, Object value) |
= value |
等于 | eq(boolean condition, R column, Object value)例:eq(age != null, "age", age) |
ne(R column, Object value) |
!= value |
不等于 | ne(condition, column, value) |
gt(R column, Object value) |
> value |
大于 | gt(condition, column, value) |
ge(R column, Object value) |
>= value |
大于等于 | ge(condition, column, value) |
lt(R column, Object value) |
< value |
小于 | lt(condition, column, value) |
le(R column, Object value) |
<= value |
小于等于 | le(condition, column, value) |
like(R column, Object value) |
LIKE '%value%' |
全模糊 | like(condition, column, value) |
likeLeft(R column, Object value) |
LIKE '%value' |
左模糊 | likeLeft(condition, column, value) |
likeRight(R column, Object value) |
LIKE 'value%' |
右模糊 | likeRight(condition, column, value) |
isNull(R column) |
IS NULL |
字段为空 | isNull(condition, column) |
isNotNull(R column) |
IS NOT NULL |
字段不为空 | isNotNull(condition, column) |
in(R column, Collection<?> values) |
IN (v1,v2...) |
包含 | in(condition, column, values) |
inSql(R column, String inValue) |
IN (sql语句) |
子查询包含 | inSql(condition, column, inValue)例:inSql(id != null, "id", "select id from tx_user where id <=3") |
notIn(R column, Collection<?> values) |
NOT IN (v1,v2...) |
不包含 | notIn(condition, column, values) |
notInSql(R column, String inValue) |
NOT IN (sql语句) |
子查询不包含 | notInSql(condition, column, inValue) |
between(R column, Object val1, Object val2) |
BETWEEN val1 AND val2 |
区间匹配 | between(condition, column, val1, val2) |
orderByAsc(R... columns) |
ORDER BY column ASC |
升序排序 | orderByAsc(condition, columns) |
orderByDesc(R... columns) |
ORDER BY column DESC |
降序排序 | orderByDesc(condition, columns) |
or() |
OR |
逻辑或(默认是 AND) | or(condition)(condition 为 true 时才拼接 OR) |
and(Consumer<Param> consumer) |
AND (分组条件) |
分组 AND(括号包裹) | 无单独 condition 参数,通过 lambda 内逻辑控制例:and(i -> i.gt("age",20).or().isNull("email")) |
select(String... columns) |
SELECT column1,column2... |
指定查询字段 | 无 condition 参数,直接指定字段例:select("name", "age") |
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) |
SELECT 符合条件的字段 |
动态筛选字段 | 例:select(User.class, info -> !info.getColumn().equals("password"))(排除 password 字段) |
- UpdateWrapper 常用方法(含 condition 参数)
UpdateWrapper 除了支持 QueryWrapper 的 所有条件方法 (用于拼接 WHERE子句),还额外提供了 SET子句的构造方法:
| 方法示例 | 对应 SQL | 说明 | condition 参数用法 |
|---|---|---|---|
set(R column, Object value) |
SET column = value |
设置字段值 | set(boolean condition, R column, Object value)例:set(name != null, "name", name) |
setSql(String sql) |
SET sql语句 |
直接拼接 SET 子句(支持复杂表达式) | setSql(boolean condition, String sql)例:setSql(age > 18, "age = age + 1") |
eq(R column, Object value) |
WHERE column = value |
等于(同 QueryWrapper) | eq(condition, column, value) |
ne(R column, Object value) |
WHERE column != value |
不等于(同 QueryWrapper) | ne(condition, column, value) |
in(R column, Collection<?> values) |
WHERE column IN (v1,v2...) |
包含(同 QueryWrapper) | in(condition, column, values) |
inSql(R column, String inValue) |
WHERE column IN (sql语句) |
子查询包含(同 QueryWrapper) | inSql(condition, column, inValue) |
and(Consumer<Param> consumer) |
AND (分组条件) |
分组 AND(括号包裹 WHERE 条件) | 例:and(i -> i.gt("age",20).or().isNull("email")) |
补充说明
inSql/notInSql:用于子查询场景,直接拼接 SQL 片段作为IN/NOT IN的参数;select方法:支持指定具体字段或动态筛选字段(排除敏感字段);and(lambda)分组 :lambda 内的条件会被括号包裹,实现AND (A OR B)的逻辑,优先级更高;- condition 参数 :所有带条件控制的方法,都可通过
boolean表达式动态决定是否拼接该条件(避免手动if判断)。
7.3 UpdateWrapper
@Test
public void test07() {
//将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
//组装set子句以及修改条件
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
//lambda表达式内的逻辑优先运算
updateWrapper
.set("age", 18)
.set("email", "user@qcby.com")
.like("name", "名")
.and(i -> i.gt("age", 20).or().isNull("email"));
//这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
//user.setName("张三");
//int result = userMapper.update(user, updateWrapper);
int result = userMapper.update(null, updateWrapper);
System.out.println(result);
}
