Mybatis-plus 中 LambdaQueryWrapper和QueryWrapper 区别对比,及完整示例演示
Mybatis-Plus 中 LambdaQueryWrapper
和 QueryWrapper
是两种用于构造 SQL 查询条件的工具类,它们的核心区别在于 类型安全性 和 语法简洁性。以下是详细对比及完整示例:
一、核心区别对比
特性 | LambdaQueryWrapper | QueryWrapper |
---|---|---|
类型安全 | ✅ 编译期校验(基于 Lambda 表达式) | ❌ 运行时校验(基于字符串表达式) |
代码可读性 | ✅ 直接引用实体类属性(如 q -> q.getAge() ) | ❌ 需手写字段名字符串(如 "age" ) |
IDE 支持 | ✅ 自动补全、智能提示 | ❌ 无提示,依赖开发者记忆字段名 |
空值处理 | ✅ 自动识别 null 值(无需显式判断 isNull) | ❌ 需手动拼接 isNull 或 isEmpty |
适用场景 | ✅ 新项目优先推荐 | ✅ 兼容旧版 Mybatis-Plus(<=2.x) |
二、完整示例演示
1. 环境准备
// 实体类 User
@Data
public class User {private Long id;private String name;private Integer age;
}// Mapper 接口
public interface UserMapper extends BaseMapper<User> {}
2. 使用 QueryWrapper(传统方式)
// 注意:字段名必须与数据库一致,否则会抛出异常!
@Test
void testQueryWrapper() {// 创建 QueryWrapper 实例QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("name", "Tom") // 字段名需严格匹配数据库列名.ge("age", 18) // 年龄大于等于 18.likeRight(true, "name", "J"); // 模糊查询(右侧匹配)// 执行查询List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
3. 使用 LambdaQueryWrapper(推荐方式)
@Test
void testLambdaQueryWrapper() {// 创建 LambdaQueryWrapper 实例(泛型推断更安全)LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();lambdaQuery.eq(User::getName, "Tom") // 方法引用,自动获取字段名.ge(User::getAge, 18) // 年龄 >= 18.likeRight(User::getName, "J"); // 模糊查询(右侧匹配)// 执行查询List<User> users = userMapper.selectList(lambdaQuery);users.forEach(System.out::println);
}
4. 关键差异解析
-
类型安全示例
如果修改实体类字段名(如将name
改为userName
),LambdaQueryWrapper 会在编译时报错,而 QueryWrapper 仅在运行时报错:// 错误示范(会导致编译失败): lambdaQuery.eq(User::getNonExistField, "value");// QueryWrapper 的错误示例(运行时才会发现): queryWrapper.eq("nonExistField", "value");
-
空值处理优化
LambdaQueryWrapper 自动识别 null 值,无需手动添加isNull
:lambdaQuery.eq(User::getAge, null); // 自动转换为 IS NULL
三、如何选择?
- 新项目开发:优先使用
LambdaQueryWrapper
,减少因字段名变更导致的故障。 - 旧项目迁移:逐步替换
QueryWrapper
,利用其兼容性过渡。 - 复杂动态 SQL:混合使用两种 Wrapper(如
Wrapper.apply()
嵌套)。
四、扩展补充
- 动态表名/特殊函数:仍需使用
QueryWrapper
拼接原生 SQL。 - 性能对比:两者生成的 SQL 完全一致,性能无差异。
- IDE 插件:安装 Lombok 增强工具可提升 Lambda 开发体验。
通过以上示例可以看出,LambdaQueryWrapper
在现代 Java 开发中具有显著优势,是 Mybatis-Plus 的最佳实践推荐方式。