MyBatis-Plus 条件构造器(Wrapper)深度解析

一、Wrapper 类体系结构

1.1 类继承关系

classDiagram
    AbstractWrapper <|-- QueryWrapper
    AbstractWrapper <|-- UpdateWrapper
    AbstractWrapper <|-- LambdaQueryWrapper
    AbstractWrapper <|-- LambdaUpdateWrapper

1.2 核心能力对比表

特性QueryWrapperUpdateWrapperLambdaQueryWrapperLambdaUpdateWrapper
字段引用方式字符串/字段名字符串/字段名Lambda表达式Lambda表达式
动态条件构建✔️✔️✔️✔️
SQL注入防护自动转义自动转义编译期校验编译期校验
多数据库支持✔️✔️✔️✔️

二、基础条件构造方法

2.1 等值条件

2.1.1 单条件构造
// 普通写法
queryWrapper.eq("name", "老王");
// Lambda写法
lambdaQueryWrapper.eq(User::getName, "老王");
2.1.2 批量条件
Map<String, Object> params = Map.of(
    "name", "老王",
    "age", 18,
    "email", null
);
queryWrapper.allEq(params); // 默认忽略null值

// 带过滤条件的批量设置
queryWrapper.allEq((k, v) -> !"id".equals(k), params);

2.2 范围条件

// BETWEEN & NOT BETWEEN
queryWrapper.between("score", 60, 80);
queryWrapper.notBetween("score", 60, 80);

// IN & NOT IN
queryWrapper.in("status", Arrays.asList(1, 2, 3));
queryWrapper.notIn("status", Arrays.asList(1, 2, 3));

// 集合为空时的特殊处理
queryWrapper.in(CollectionUtils.isEmpty(ids), "id", ids);

三、高级查询特性

3.1 模糊查询

// 各种LIKE模式
queryWrapper.like("name", "老");       // %老%
queryWrapper.likeLeft("name", "老");   // 老%
queryWrapper.likeRight("name", "王");  // %王

3.2 空值处理

// IS NULL & IS NOT NULL
queryWrapper.isNull("email");
queryWrapper.isNotNull("email");

// 特殊场景处理
queryWrapper.eq("age", null); // 自动转换为 IS NULL

3.3 数学运算

// 支持数学符号的条件
queryWrapper.gt("price", 100);     // >
queryWrapper.ge("price", 100);     // >=
queryWrapper.lt("price", 100);     // <
queryWrapper.le("price", 100);     // <=

四、复杂逻辑构建

4.1 条件组合

// AND/OR混合使用
queryWrapper
    .eq("status", 1)
    .and(i -> i.gt("age", 18).lt("age", 30))
    .or()
    .eq("vip", true);

4.2 嵌套查询

// 子查询支持
queryWrapper.inSql("id", "select user_id from orders where amount > 100");

4.3 SQL片段注入

// 安全的SQL片段插入
queryWrapper.apply("date_format(create_time, '%Y-%m-%d') = '2025-08-22'");

五、排序与聚合

5.1 结果排序

// 多字段排序
queryWrapper.orderByAsc("create_time").orderByDesc("update_time");

// 自定义排序规则
queryWrapper.orderBy(true, false, "age"); // true表示升序

5.2 分组统计

// 基础分组
queryWrapper.groupBy("dept_id");

// 分组后筛选
queryWrapper.having("count(1) > 10");

六、更新操作构造

6.1 字段更新

// 基础更新
updateWrapper.set("status", 2);

// 动态条件更新
updateWrapper.set("version", "v2").eq("id", 1);

// 批量更新
updateWrapper.setSql("status = case id when 1 then 2 when 3 then 4 end");

6.2 自增/自减操作

// 支持原子操作
lambdaUpdateWrapper.setIncr(User::getScore, 10);
lambdaUpdateWrapper.setDecr(User::getBalance, 50);

七、Lambda表达式进阶

7.1 复杂条件构造

lambdaQueryWrapper
    .select(User::getId, User::getName)
    .eq(User::getStatus, 1)
    .and(wrapper -> wrapper.gt(User::getAge, 18).or().isNull(User::getEmail));

7.2 实体辅助构造

User user = new User();
user.setName("老王");
lambdaQueryWrapper.eq(User::getName, user.getName());

八、性能优化指南

8.1 N+1问题防治

# MyBatis配置示例
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

8.2 执行计划分析

-- 开启慢查询日志(MySQL示例)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

九、安全实践规范

9.1 防御SQL注入

// 安全写法
queryWrapper.like("name", "%" + param + "%"); // 自动转义

// 危险写法(禁止使用)
queryWrapper.apply("name like '%" + param + "%'");

9.2 参数校验策略

// 推荐校验方式
if (StringUtils.isBlank(param)) {
    throw new IllegalArgumentException("参数不能为空");
}

十、版本演进说明

版本号新增特性废弃方法
3.5.6+setIncrBy/setDecrBy支持deprecatedMethod()
3.4.3.2+gtSql/geSql等SQL语法支持rawSql()
3.0.7+自定义SQL片段支持legacyWrapper()

十一,总结

该教程聚焦于 ​​MyBatis-Plus 的 Wrapper 条件构造器​​,从基础到高级、从查询到更新、从用法到优化与安全,提供了系统化的知识讲解,非常适合 MyBatis-Plus 的中级到高级用户学习与参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值