LambdaQueryWrapper 详解
LambdaQueryWrapper 是 MyBatis-Plus 框架中的一个核心查询构造器,它通过 Java 8 的 Lambda 表达式方式构建 SQL 查询条件,提供了类型安全的查询条件构造方式。
基本概念
-
类型安全:使用实体类的 getter 方法引用(如
User::getName)代替字符串形式的字段名(如"name"),避免拼写错误 -
链式调用:支持方法链式调用,可以流畅地组合多个查询条件
-
Lambda 表达式:利用 Java 8 的 Lambda 特性,使代码更加简洁优雅
与普通 QueryWrapper 的区别
|
特性 |
LambdaQueryWrapper |
QueryWrapper |
|---|---|---|
|
字段引用方式 |
方法引用 (User::getName) |
字符串 ("name") |
|
类型安全 |
是 |
否 |
|
IDE 支持 |
自动补全、重构友好 |
需要手动输入字符串 |
|
防止 SQL 注入 |
内置防护 |
内置防护 |
|
可读性 |
更高 |
较低 |
核心优势
-
编译时检查:字段名错误会在编译时报错,而不是运行时
-
重构友好:修改实体类字段名时,IDE 可以自动更新所有引用
-
代码可读性:Lambda 表达式使查询逻辑更加清晰
-
减少错误:避免因字符串拼写错误导致的查询问题
适用场景
-
需要构建复杂动态查询条件时
-
项目对代码健壮性要求较高时
-
需要频繁重构或字段名可能变更时
-
团队协作开发,需要提高代码可读性时
LambdaQueryWrapper 是 MyBatis-Plus 推荐的查询条件构造方式,特别适合中大型项目的开发维护。
--------------------------------------------
常用方法:
1. 基础查询方法
|
方法 |
说明 |
示例 |
|---|---|---|
|
|
等于 |
|
|
|
不等于 |
|
|
|
大于 |
|
|
|
大于等于 |
|
|
|
小于 |
|
|
|
小于等于 |
|
|
|
介于 |
|
|
|
不介于 |
|
|
|
模糊查询 |
|
|
|
不模糊查询 |
|
|
|
左模糊 |
|
|
|
右模糊 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. 逻辑组合方法
|
方法 |
说明 |
示例 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
嵌套条件 |
|
|
|
自定义 SQL 片段 |
|
3. 排序 & 分组
|
方法 |
说明 |
示例 |
|---|---|---|
|
|
升序排序 |
|
|
|
降序排序 |
|
|
|
分组 |
|
4. 其他实用方法
|
方法 |
说明 |
示例 |
|---|---|---|
|
|
指定查询字段 |
|
|
|
|
|
|
|
|
|
|
|
拼接 SQL 末尾 |
|
📌 完整示例
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);
💡 使用建议
-
避免硬编码字段名,使用
User::getName代替"name",防止字段名修改后出错。 -
链式调用 更易读,如
.eq(...).gt(...).orderBy(...)。 -
组合复杂条件 时,合理使用
and()、or()和nested()。
-----------------------
orderByAsc()方法详解
orderByAsc()是 MyBatis-Plus 中 LambdaQueryWrapper和 QueryWrapper提供的排序方法,用于指定查询结果的升序排序规则。
方法定义
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)
)
注意事项
-
多次调用效果:多次调用
orderByAsc()会追加排序条件,不是覆盖 -
与
orderByDesc()混合:可以混合使用升序和降序排序.orderByAsc(User::getDepartmentId) .orderByDesc(User::getSalary) -
空值处理:排序时空值的处理方式遵循数据库的默认行为
-
性能影响:排序可能影响查询性能,特别是大数据量表
实际应用场景
-
按时间先后顺序显示数据
-
按字母顺序排列名称
-
需要多字段组合排序的业务场景
-
分页查询时指定排序规则
orderByAsc()方法提供了一种类型安全、可读性高的方式来表达 SQL 中的升序排序需求。
更多推荐
所有评论(0)