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);
}
相关推荐
环流_1 天前
多线程3(线程安全问题及解决方案)
java·开发语言
跃渊Yuey1 天前
【MySQL】MySQL库的操作
数据库·mysql
weixin_408717771 天前
PHP8.1新特性对AI开发帮助_JIT编译优势【解答】
jvm·数据库·python
瀚高PG实验室1 天前
瀚高数据库安全版4.5.10及其以上版本使用pg_cron定时任务
服务器·数据库·瀚高数据库
2401_871696521 天前
golang如何实现Trie前缀树_golang Trie前缀树实现解析
jvm·数据库·python
2401_887724501 天前
Go语言怎么做HTTP连接池_Go语言HTTP连接池教程【基础】
jvm·数据库·python
yuanzhengme1 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
qq_334563551 天前
Redis怎样实现Session的分布式共享
jvm·数据库·python
m0_493934531 天前
CSS如何实现背景图片重复平铺_设置background-repeat为repeat
jvm·数据库·python
FeBaby1 天前
Java 高并发场景下 Redis 分布式锁(UUID+Lua)最佳实践
java·redis·分布式