MP3️⃣进阶①DQL:条件构造器
Wrapper:条件构造器
条件构造器:封装了复杂的 SQL 查询条件。
通过编程的方式,自动拼接 SQL 查询条件,且支持链式编程。
-
QueryWrapper:构建查询条件
-
LambdaQueryWrapper:支持 lambda 形式
1、基本条件
- 等值:eq(),ne()
- 包含:in()
- 模糊:like()
- 范围
- 大于:gt()
- 大于等于:ge()
- 小于:lt()
- 小于等于:lte()
- 区间:between(),左右包含
1.1、等值
eq()
和ne()
示例:以 eq()
为例,模拟登录用户验证。
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "admin")
.eq(User::getPassword, "admin");
userDao.selectOne(wrapper);
1.2、包含
in()
示例:查询指定年龄的用户。
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.in(User::getAge, 18, 20);
List<User> userList = userDao.selectList(wrapper);
System.out.println(userList);
1.3、模糊
like()
:前后拼接%
likeRight()
:后拼接%
likeLeft()
:前拼接%
示例:查询 name 以
J
开头,e
结尾的用户。
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>();
wrapper.likeRight(User::getName, "J")
.likeLeft(User::getName, "e");
List<User> userList = userDao.selectList(wrapper);
System.out.println(userList);
1.4、范围
示例:查询年龄在 [18, 30] 区间的用户。
-
lt()
+gt()
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.ge(User::getAge, 18) .lte(User::getAge, 30); userDao.selectList(wrapper);
-
between()
:建议LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.between(User::getAge, 18, 30); userDao.selectList(wrapper);
2、逻辑
2.1、判空
-
Wrapper 可以定义属性筛选规则,拼接 SQL 查询条件。
-
而实际上 entity 中的该属性可能并没有被赋值,即为 null。
-
以 LeetCode 为例,筛选条件可选可不选。
-
此时,需要判断相应属性非 null,才进行条件拼接。
模拟需求
示例:根据用户输入(可 null),查询指定年龄区间的用户。
-
定义 UserQuery 类(继承 User),用于接收 age 和 maxAge。
@Data public class UserQuery extends User { private int maxAge; }
-
调用
lt()
和gt()
重载方法,首个参数(Condition
)为 true 才拼接。void test(UserQuery userQuery) { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.gt(null != userQuery.getAge(), User::getAge, userQuery.getAge()) .lt(null != userQuery.getAge(), User::getAge, userQuery.getMaxAge()); userDao.selectList(wrapper); }
2.2、拼接子句(and/or)
-
and:年龄在 18-30 之间
// 无需额外操作 wrapper.gt(User::getAge, 18) .lt(User::getAge, 30);
-
or:年龄在 18 和 30 之外
// 添加 or() 方法 wrapper.lt(User::getAge, 18) .or() .gt(User::getAge, 30);
3、查询投影
默认情况下,MP 查询结果包含数据库表的所有字段(
SELECT *
)查询投影:只查询出指定内容。
3.1、指定字段
调用
select()
筛选指定列
-
QueryWrapper:指定字段名
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.select("name", "age"); userDao.selectList(wrapper);
-
LambdaQueryWrapper:方法引用
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper1.select(User::getName, User::getAge); userDao.selectList(wrapper);
3.2、聚合函数
调用 QueryWrapper 的
select()
,指定聚合函数。调用 BaseMapper 的
selectMaps
,存储返回值。
-
COUNT
-
SUM
-
MAX
-
MIN
-
AVG
QueryWrapper<User> wrapper = new QueryWrapper<>(); // wrapper.select("COUNT(*)"); // wrapper.select("SUM(age)"); // wrapper.select("MAX(age)"); // wrapper.select("MIN(age)"); // wrapper.select("AVG(age)"); userDao.selectMaps(wrapper);
3.3、分组查询
示例:查询每个名字对应的人数。
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("name, COUNT(*)");
wrapper.groupBy("name");
userDao.selectMaps(wrapper);
3.4、排序查询
示例:按年龄升序,按 id 降序
Hint:参数(是否排序,是否升序,操作列)
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.orderBy(true, true, User::getAge)
.orderBy(true, false, User::getId);
userDao.selectList(wrapper);