一、Wrapper 类体系结构
1.1 类继承关系
classDiagram
AbstractWrapper <|-- QueryWrapper
AbstractWrapper <|-- UpdateWrapper
AbstractWrapper <|-- LambdaQueryWrapper
AbstractWrapper <|-- LambdaUpdateWrapper
1.2 核心能力对比表
特性 | QueryWrapper | UpdateWrapper | LambdaQueryWrapper | LambdaUpdateWrapper |
---|---|---|---|---|
字段引用方式 | 字符串/字段名 | 字符串/字段名 | 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 的中级到高级用户学习与参考。