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);
}
相关推荐
Arva .16 小时前
深分页与游标
数据库·oracle
idolao17 小时前
MySQL 5.7 安装教程:详细步骤+自定义安装+命令行客户端配置(Windows版)
数据库·windows·mysql
daidaidaiyu17 小时前
JMS, ActiveMQ 学习一则
java
20年编程老鸟java+ai全栈17 小时前
mysql、pg、oracel数据库迁移避坑指南
数据库·mysql
weixin_7042660517 小时前
SpringBoot全注解开发指南
java·spring boot·mybatis
星如雨グッ!(๑•̀ㅂ•́)و✧17 小时前
Webflux fromXXX对比
java
Rsun0455118 小时前
Redis中实现访问量计数
数据库·redis·缓存
西柚00118 小时前
Ubuntu22.04.5 + Docker + MySQL 5.7
mysql·docker·容器
competes18 小时前
学生需求 交易累计积分,积分兑换奖品
java·大数据·开发语言·人工智能·java-ee
小羊子说18 小时前
Android系统中 socketpair 的源码解读与应用分析小结
android·java