MyBatis-Plus条件构造器queryWrapper学习
关于 MyBatis-Plus 条件构造器 QueryWrapper
1. QueryWrapper 是什么?
QueryWrapper 是 MyBatis-Plus 提供的一个工具类,用于通过 Java 代码动态构建 SQL 查询条件,避免手写 SQL 字符串。它的核心作用是 简化条件查询的编写,提高代码可读性和维护性。
2. 基础用法示例
假设有一个 User 表,字段包括 id、name、age、email。
(1) 等值查询
查询 name 为 "张三" 的用户:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");
List<User> userList = userMapper.selectList(queryWrapper);
生成的 SQL:
SELECT * FROM user WHERE name = '张三';
(2) 范围查询
查询 age 在 20 到 30 之间的用户:
queryWrapper.between("age", 20, 30);
List<User> userList = userMapper.selectList(queryWrapper);
生成的 SQL:
SELECT * FROM user WHERE age BETWEEN 20 AND 30;
(3) 模糊查询
查询 name 包含 "张" 的用户:
queryWrapper.like("name", "张");
List<User> userList = userMapper.selectList(queryWrapper);
生成的 SQL:
SELECT * FROM user WHERE name LIKE '%张%';
3. 链式调用
QueryWrapper 支持链式调用,使代码更简洁:
List<User> userList = userMapper.selectList(
new QueryWrapper<User>()
.eq("age", 25)
.like("email", "@gmail.com")
.orderByDesc("id")
);
生成的 SQL:
SELECT * FROM user
WHERE age = 25 AND email LIKE '%@gmail.com%'
ORDER BY id DESC;
4. 复杂条件组合
(1) AND 条件
查询 age > 20 且 email 不为空的用户:
queryWrapper.gt("age", 20)
.isNotNull("email");
(2) OR 条件
查询 name 为 "张三" 或 age < 18 的用户:
queryWrapper.eq("name", "张三")
.or()
.lt("age", 18);
生成的 SQL:
SELECT * FROM user WHERE name = '张三' OR age < 18;
5. 动态条件构建
根据业务逻辑动态添加条件(如前端筛选表单):
public List<User> searchUsers(String name, Integer minAge) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
if (name != null && !name.isEmpty()) {
queryWrapper.like("name", name);
}
if (minAge != null) {
queryWrapper.ge("age", minAge);
}
return userMapper.selectList(queryWrapper);
}
- 调用示例:
List<User> users1 = searchUsers("张", 20); // 查询 name含"张"且 age>=20 List<User> users2 = searchUsers(null, 18); // 仅查询 age>=18
6. 使用 Lambda 表达式
通过 LambdaQueryWrapper 避免字段名硬编码(更安全):
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getName, "张三")
.ge(User::getAge, 20);
List<User> userList = userMapper.selectList(lambdaQuery);
生成的 SQL:
SELECT * FROM user WHERE name = '张三' AND age >= 20;
7. 常用方法总结
| 方法名 | 作用 | 示例 |
|---|---|---|
eq |
等于 = |
.eq("name", "张三") |
ne |
不等于 <> |
.ne("status", 0) |
gt |
大于 > |
.gt("age", 18) |
ge |
大于等于 >= |
.ge("score", 60) |
lt |
小于 < |
.lt("price", 100) |
le |
小于等于 <= |
.le("count", 10) |
between |
范围 BETWEEN |
.between("age", 20, 30) |
like |
模糊查询 LIKE '%值%' |
.like("name", "张") |
in |
包含 IN (v1, v2) |
.in("id", Arrays.asList(1, 2)) |
orderByAsc |
升序排序 ORDER BY |
.orderByAsc("age") |
groupBy |
分组 GROUP BY |
.groupBy("department") |
8. 最佳实践
- 优先使用
LambdaQueryWrapper:避免字段名硬编码,提高代码安全性和可维护性。 - 动态条件时判空:避免传入
null导致 SQL 异常。 - 结合分页插件使用:
Page<User> page = new Page<>(1, 10); // 第1页,每页10条 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.ge("age", 18); IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
9. 层级关系

在上面的图片中,
Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
9. 常用方法对照表及其案例
QueryWrapper的方法:

通过 QueryWrapper,你可以用 Java 代码轻松构建复杂的 SQL 查询条件,让数据库操作更加高效和安全!

浙公网安备 33010602011771号