05-在Mybatis中使用QueryWrapper进行查询
QueryWrapper介绍
在 MyBatis-Plus 中,QueryWrapper 是一个非常常用的查询构造器,用于简化 SQL 查询条件的编写。它可以帮助你以面向对象的方式构建 WHERE 条件、ORDER BY 排序、LIKE 模糊查询、BETWEEN 范围查询等,避免直接编写 SQL 语句,提高开发效率。

1. 第一种方法, 使用Wrappers.query()的方式,动态指定字段名和字段名
(1)使用Wrappers.<T>query() 静态方法
@GetMapping("/select")
@ApiOperationSupport(order = 8)
@Operation(summary = "下拉数据源", description = "传入specialty")
public R < List < Specialty >> select(String tenantId, BladeUser bladeUser) {
// 使用Wrappers.<T>query() 静态方法
List<Specialty> list = specialtyService.list(Wrappers.<Specialty>query().eq("tenant_id", Func.toStrWithEmpty(tenantId, bladeUser.getTenantId())));
return R.data(list);
}
(2)创建了一个 QueryWrapper<Specialty> 对象
@GetMapping("/select")
@ApiOperationSupport(order = 8)
@Operation(summary = "下拉数据源", description = "传入specialty")
public R<List<Specialty>> select(String tenantId, BladeUser bladeUser) {
// 创建了一个 QueryWrapper<Specialty> 对象
List<Specialty> list = specialtyService.list(new QueryWrapper<Specialty>().eq("tenant_id", Func.toStrWithEmpty(tenantId, bladeUser.getTenantId())));
return R.data(list);
}
优点:
-
字段名可动态构造,例如前端传字段名,后端拼接查询;
-
更适合在工具方法、通用查询模块中使用。
缺点:
- 字段名硬编码,容易出错
- 不支持编译期检查
- 重构时需要手动修改字段名
2. 第二种方法,使用Wrappers.query().lambda()的方式(推荐)
调用顺序方面,首先通过Wrappers.query() 返回的 QueryWrapper<T>类型,再通过.lambda() 返回的 LambdaQueryWrapper<T>类型
(1)使用Wrappers.<T>query() 静态方法
@GetMapping("/select")
@ApiOperationSupport(order = 8)
@Operation(summary = "下拉数据源", description = "传入specialty")
public R<List<Specialty>> select(String tenantId, BladeUser bladeUser) {
// 使用Wrappers.<T>query() 静态方法
List<Specialty> list = specialtyService.list(Wrappers.<Specialty>query().lambda().eq(Specialty::getTenantId, Func.toStrWithEmpty(tenantId, bladeUser.getTenantId())));
return R.data(list);
}
(2)创建了一个 QueryWrapper<Specialty> 对象
@GetMapping("/select")
@ApiOperationSupport(order = 8)
@Operation(summary = "下拉数据源", description = "传入specialty")
public R<List<Specialty>> select(String tenantId, BladeUser bladeUser) {
// 创建了一个 QueryWrapper<Specialty> 对象
List<Specialty> list = specialtyService.list(new QueryWrapper<Specialty>().lambda().eq(Specialty::getTenantId, Func.toStrWithEmpty(tenantId, bladeUser.getTenantId())));
return R.data(list);
}
优点:
- 类型安全,编译期检查
- 支持 Lambda 表达式,避免硬编码字段名
- 代码重构友好
3. 第三种方法,直接使用Wrappers.lambdaQuery()方式,返回 LambdaQueryWrapper<T>类型
本质上与第二种方法Wrappers.query().lambda() 相同,但书写方式更加简洁
这里需要注意,lambdaQuery() 是 Wrappers 工具类提供的静态方法,不是 QueryWrapper 的实例方法。
@GetMapping("/select")
@ApiOperationSupport(order = 8)
@Operation(summary = "下拉数据源", description = "传入specialty")
public R<List<Specialty>> select(String tenantId, BladeUser bladeUser) {
// 使用Wrappers.<T>query() 静态方法
List<Specialty> list = specialtyService.list(Wrappers.<Specialty> lambdaQuery().eq(Specialty::getTenantId, Func.toStrWithEmpty(tenantId, bladeUser.getTenantId())));
return R.data(list);
}

浙公网安备 33010602011771号