LambdaQueryWrapper 是 MyBatis-Plus 框架中的一个核心查询构造器,它通过 Java 8 的 Lambda 表达式方式构建 SQL 查询条件,提供了类型安全的查询条件构造方式。

基本概念

  1. ​类型安全​​:使用实体类的 getter 方法引用(如 User::getName)代替字符串形式的字段名(如 "name"),避免拼写错误

  2. ​链式调用​​:支持方法链式调用,可以流畅地组合多个查询条件

  3. ​Lambda 表达式​​:利用 Java 8 的 Lambda 特性,使代码更加简洁优雅

与普通 QueryWrapper 的区别

特性

LambdaQueryWrapper

QueryWrapper

字段引用方式

方法引用 (User::getName)

字符串 ("name")

类型安全

IDE 支持

自动补全、重构友好

需要手动输入字符串

防止 SQL 注入

内置防护

内置防护

可读性

更高

较低

核心优势

  1. ​编译时检查​​:字段名错误会在编译时报错,而不是运行时

  2. ​重构友好​​:修改实体类字段名时,IDE 可以自动更新所有引用

  3. ​代码可读性​​:Lambda 表达式使查询逻辑更加清晰

  4. ​减少错误​​:避免因字符串拼写错误导致的查询问题

适用场景

  • 需要构建复杂动态查询条件时

  • 项目对代码健壮性要求较高时

  • 需要频繁重构或字段名可能变更时

  • 团队协作开发,需要提高代码可读性时

LambdaQueryWrapper 是 MyBatis-Plus 推荐的查询条件构造方式,特别适合中大型项目的开发维护。

--------------------------------------------

 ​​常用方法​​:

​1. 基础查询方法​

方法

说明

示例

eq()

等于 =

.eq(User::getName, "张三")

ne()

不等于 <>

.ne(User::getAge, 18)

gt()

大于 >

.gt(User::getAge, 18)

ge()

大于等于 >=

.ge(User::getAge, 18)

lt()

小于 <

.lt(User::getAge, 30)

le()

小于等于 <=

.le(User::getAge, 30)

between()

介于 BETWEEN

.between(User::getAge, 18, 30)

notBetween()

不介于 NOT BETWEEN

.notBetween(User::getAge, 18, 30)

like()

模糊查询 LIKE '%值%'

.like(User::getName, "张")

notLike()

不模糊查询 NOT LIKE

.notLike(User::getName, "张")

likeLeft()

左模糊 LIKE '%值'

.likeLeft(User::getName, "张")

likeRight()

右模糊 LIKE '值%'

.likeRight(User::getName, "张")

isNull()

IS NULL

.isNull(User::getEmail)

isNotNull()

IS NOT NULL

.isNotNull(User::getEmail)

in()

IN (v1, v2, ...)

.in(User::getId, Arrays.asList(1, 2, 3))

notIn()

NOT IN (v1, v2, ...)

.notIn(User::getId, Arrays.asList(1, 2, 3))


​2. 逻辑组合方法​

方法

说明

示例

and()

AND连接条件

.eq(...).and(w -> w.gt(...))

or()

OR连接条件

.eq(...).or().gt(...)

nested()

嵌套条件

.nested(w -> w.eq(...).or().gt(...))

apply()

自定义 SQL 片段

.apply("date_format(create_time, '%Y-%m-%d') = {0}", "2023-10-01")


​3. 排序 & 分组​

方法

说明

示例

orderByAsc()

升序排序

.orderByAsc(User::getAge)

orderByDesc()

降序排序

.orderByDesc(User::getCreateTime)

groupBy()

分组

.groupBy(User::getDeptId)


​4. 其他实用方法​

方法

说明

示例

select()

指定查询字段

.select(User::getId, User::getName)

exists()

EXISTS子查询

.exists("SELECT 1 FROM dept WHERE dept.id = user.dept_id")

notExists()

NOT EXISTS子查询

.notExists("SELECT 1 FROM dept WHERE dept.id = user.dept_id")

last()

拼接 SQL 末尾

.last("LIMIT 10")


​📌 完整示例​

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
    .eq(User::getStatus, 1)  // status = 1
    .gt(User::getAge, 18)    // age > 18
    .like(User::getName, "张") // name LIKE '%张%'
    .orderByDesc(User::getCreateTime) // 按创建时间降序
    .last("LIMIT 10"); // 限制10条

List<User> userList = userMapper.selectList(queryWrapper);

​💡 使用建议​

  1. ​避免硬编码字段名​​,使用 User::getName代替 "name",防止字段名修改后出错。

  2. ​链式调用​​ 更易读,如 .eq(...).gt(...).orderBy(...)

  3. ​组合复杂条件​​ 时,合理使用 and()or()nested()

-----------------------

orderByAsc()方法详解

orderByAsc()是 MyBatis-Plus 中 LambdaQueryWrapperQueryWrapper提供的排序方法,用于指定查询结果的升序排序规则。

方法定义

LambdaQueryWrapper<T> orderByAsc(SFunction<T, ?> column)

基本用法

// 按单个字段升序排序
new LambdaQueryWrapper<User>()
    .orderByAsc(User::getCreateTime);  // ORDER BY create_time ASC

// 按多个字段升序排序
new LambdaQueryWrapper<User>()
    .orderByAsc(User::getAge, User::getCreateTime);  // ORDER BY age ASC, create_time ASC

与 SQL 对应关系

-- Java 代码
.orderByAsc(User::getName)

-- 对应 SQL
ORDER BY name ASC

链式调用示例

List<User> users = new LambdaQueryWrapper<User>()
    .eq(User::getStatus, 1)
    .gt(User::getAge, 18)
    .orderByAsc(User::getAge)      // 先按年龄升序
    .orderByAsc(User::getCreateTime) // 再按创建时间升序
    .list();

综合示例

List<FrontierExpressCatalogEntity> entityList = frontierExpressCatalogMapper.selectList(
    new LambdaQueryWrapper<FrontierExpressCatalogEntity>().orderByAsc(FrontierExpressCatalogEntity::getOrderNo)
)

注意事项

  1. ​多次调用效果​​:多次调用 orderByAsc()会追加排序条件,不是覆盖

  2. ​与 orderByDesc()混合​​:可以混合使用升序和降序排序

    .orderByAsc(User::getDepartmentId)
    .orderByDesc(User::getSalary)
  3. ​空值处理​​:排序时空值的处理方式遵循数据库的默认行为

  4. ​性能影响​​:排序可能影响查询性能,特别是大数据量表

实际应用场景

  1. 按时间先后顺序显示数据

  2. 按字母顺序排列名称

  3. 需要多字段组合排序的业务场景

  4. 分页查询时指定排序规则

orderByAsc()方法提供了一种类型安全、可读性高的方式来表达 SQL 中的升序排序需求。

更多推荐