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);
}

 

posted @ 2025-05-29 18:35  马铃薯1  阅读(395)  评论(0)    收藏  举报