MybatisPlus条件构造器(上)

目录

[7 条件构造器](#7 条件构造器)

[7.1 条件构造器介绍](#7.1 条件构造器介绍)

[7.2 常用方法](#7.2 常用方法)

补充说明

[7.3 UpdateWrapper](#7.3 UpdateWrapper)


7 条件构造器

7.1 条件构造器介绍

  1. Wrapper : 条件构造抽象类,是整个条件构造器的最顶端父类,定义了条件构造的基础规范。
  2. AbstractWrapper : 所有条件构造器的父类,用于封装查询 / 更新的条件,生成 SQL 的 WHERE 子句(支持eq、like等条件拼接)。
  3. QueryWrapper : 专门用于构造查询 / 删除操作的条件(对应SELECT/DELETE语句的WHERE子句)。
  4. UpdateWrapper : 专门用于构造更新操作的条件(对应UPDATE语句的SET和WHERE子句,支持直接通过set方法设置更新字段)。
  5. AbstractLambdaWrapper : Lambda 风格条件构造器的父类,支持通过实体类的方法引用(如User::getName)指定字段,避免硬编码字段名。
  6. LambdaQueryWrapper :Lambda 风格的查询 / 删除条件构造器(基于AbstractLambdaWrapper,功能同QueryWrapper,但用 Lambda 指定字段)。
  7. LambdaUpdateWrapper : Lambda 风格的更新条件构造器(基于AbstractLambdaWrapper,功能同UpdateWrapper,但用 Lambda 指定字段)。
    注:MybatisPlus提供的带有条件构造器的内置方法,入参类型都是Wrapper,说明只要是Wrapper的子类都可以作为入参。

7.2 常用方法

  1. 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 字段)
  1. 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"))

补充说明

  1. inSql/notInSql :用于子查询场景,直接拼接 SQL 片段作为IN/NOT IN的参数;
  2. select方法:支持指定具体字段或动态筛选字段(排除敏感字段);
  3. and(lambda)分组 :lambda 内的条件会被括号包裹,实现AND (A OR B)的逻辑,优先级更高;
  4. 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);
}
相关推荐
Emily156853598701 天前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
就叫_这个吧1 天前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡1 天前
AI 应用系统设计
java·开发语言·人工智能
城管不管1 天前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅1 天前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
倔强的石头1061 天前
向量数据库从相似度检索走向融合数据底座
数据库
AI绘画哇哒哒1 天前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰1 天前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
今天AI了吗1 天前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
夜雪一千1 天前
MySQL 全局锁是什么?原理、风险、备份踩坑完整实战
android·mysql·adb