MyBatis-Plus的LambdaQuery用法
核心概括:LambdaQueryWrapper 本质上是一个条件包装器(与wrapper类似),而 Mapper 方法(如 selectList)负责补充完整的 SQL 结构
在 Java 后端开发中(特别是使用 MyBatis-Plus 框架时),LambdaQuery()
是一种基于 Lambda 表达式的类型安全查询方式,它利用 Java 8 的 Lambda 特性,避免了硬编码字段名,提升了代码可读性和可维护性。
核心优势
- 类型安全:编译器检查字段引用,避免拼写错误
- 代码可读性:链式调用,语义清晰
- 重构友好:字段名修改后 IDE 自动更新 Lambda 引用
基本使用步骤(MyBatis-Plus 示例)
1. 创建 Lambda 查询包装器
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;// 泛型指定实体类型
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
2. 链式构建查询条件
lambdaQuery.eq(User::getName, "John") // WHERE name = 'John'.gt(User::getAge, 18) // AND age > 18.like(User::getEmail, "@gmail") // AND email LIKE '%@gmail%'.orderByDesc(User::getCreateTime); // ORDER BY create_time DESC
3. 执行查询
// 注入 Mapper(MyBatis-Plus 的 BaseMapper)
@Autowired
private UserMapper userMapper;public List<User> queryUsers() {return userMapper.selectList(lambdaQuery);
}
常用方法详解 & 示例
假设有 User
实体类:
public class User {private Long id;private String name;private Integer age;private String email;private LocalDateTime createTime;// 省略 getter/setter
}
1. 等值查询(eq)
lambdaQuery.eq(User::getName, "Alice"); // WHERE name = 'Alice'
2. 模糊查询(like)
lambdaQuery.like(User::getEmail, "hotmail"); // WHERE email LIKE '%hotmail%'
3. 范围查询(between)
// 查询年龄在 20~30 的用户
lambdaQuery.between(User::getAge, 20, 30); // WHERE age BETWEEN 20 AND 30
4. 嵌套条件(and/or)
lambdaQuery.eq(User::getAge, 25).and(q -> q.like(User::getName, "Tom").or().eq(User::getEmail, "tom@example.com"));
// WHERE age = 25 AND (name LIKE '%Tom%' OR email = 'tom@example.com')
5. 排序(orderBy)
lambdaQuery.orderByAsc(User::getAge) // 年龄升序.orderByDesc(User::getId); // ID降序
// ORDER BY age ASC, id DESC
6. 选择字段(select)
lambdaQuery.select(User::getId, User::getName) // 只查询 id 和 name 字段.like(User::getName, "A");
// SELECT id, name FROM user WHERE name LIKE '%A%'
7. 动态条件(避免 if 判断)
public List<User> queryUsers(String name, Integer minAge) {return new LambdaQueryWrapper<User>().eq(StringUtils.isNotBlank(name), User::getName, name).gt(minAge != null, User::getAge, minAge).list();
}
// 当 name 非空时添加 name 条件,当 minAge 非空时添加 age 条件
完整示例场景
需求: 查询邮箱包含 "google"、年龄 ≥ 25、按创建时间倒序的前 10 条用户 Java 代码:
List<User> users = new LambdaQueryWrapper<User>().like(User::getEmail, "google").ge(User::getAge, 25) // ge = greater or equal (>=).orderByDesc(User::getCreateTime).last("LIMIT 10") // 特殊 SQL 拼接.list(); // 执行查询
注意事项
LambdaQueryWrapper
需要 MyBatis-Plus 3.x+- 实体类需有 Getter 方法(Lambda 基于方法引用)
- 复杂 SQL(如多表联查)建议仍用 XML/注解方式
- 避免在循环中频繁创建
LambdaQueryWrapper
对象
通过 LambdaQuery 可以大幅减少 SQL 拼接的错误率,让查询代码更加简洁优雅。它是现代 Java 后端开发中处理单表查询的首选方式。