目录
4. LambdaQueryWrapper、LambdaUpdateWrapper(推荐)
各构造器关系如下图所示。
作用:用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件。
AbstractWrapper为我们提供了许多常用的条件判断方法,各方法功能整理见下表。
具体见官网:条件构造器
QueryWrapper 继承了 AbstractWrapper 的条件判断方法,同时为我们提供select方法。
//SELECT id,username,info FROM tb_user WHERE (username LIKE '%o%' AND balance >= 1000)
@Test
void testQueryWrapper() {
//1.构建查询条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.select("id", "username", "info")
.like("username", "o")
.ge("balance", 1000);
//2.获取查询结果
List<User> users = userMapper.selectList(wrapper);
System.out.println(users.toString());
}
UpdateWrapper? 继承自 AbstractWrapper 的条件判断方法,同时为我们提供set方法。
当遇到特殊的更新(如:blance = blance -200),可以使用UpdateWrapper。
如果是简单的直接赋值,可以使用QueryWrapper。
(本质就是select和set语句的选择)
//特殊赋值——使用UpdateWrapper更新
//UPDATE tb_user SET balance = balance - 200 WHERE (id IN (?,?,?))
@Test
void testUpdateWrapper() {
List<Long> ids = List.of(1L, 2L, 4L);
UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
.setSql("balance = balance - 200")
.in("id", ids);
userMapper.update(null, wrapper);
}
//简单赋值——使用QueryWrapper更新
//UPDATE tb_user SET balance=2000 WHERE (username = "jack")
@Test
void testUpdateByQueryWrapper() {
//1.设置更新数据
User user = new User();
user.setBalance(2000);
//2.设置更新条件
QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "jack");
//3.进行更新
userMapper.update(user, wrapper);
}
LambdaQueryWrapper 和 LambdaUpdateWrapper 是相对于 QueryWrapper 及 UpdateWrapper 的 Lmbda 语法实现方式(用函数替代方法中的字段,避免硬编码)。
两种获取方式:
//1.通过QueryWrapper().lambda()获取
LambdaQueryWrapper queryLambda = new QueryWrapper().lambda();
//2.直接new一个LambdaQueryWrapper<>()获取
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
//LambdaUpdateWrapper获取方式同理
LambdaUpdateWrapper updateLambda = new UpdateWrapper().lambda();
LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper();
对比:分别使用 QueryWrapper 与 LambdaQueryWrapper 进行查询:
//SELECT id,username,info FROM tb_user WHERE (username LIKE '%o%' AND balance >= 1000)
//使用QueryWrapper进行查询
@Test
void testQueryWrapper() {
//1.构建查询条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.select("id", "username", "info")
.like("username", "o")
.ge("balance", 1000);
//2.获取查询结果
List<User> users = userMapper.selectList(wrapper);
System.out.println(users.toString());
}
//使用LambdaQueryWrapper进行查询(用函数替换方法中的字段参数)
@Test
void testLambdaQueryWrapper() {
//1.构建查询条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.select(User::getId, User::getUsername, User::getInfo)
.like(User::getUsername, "o")
.ge(User::getBalance, 1000);
//2.获取查询结果
List<User> users = userMapper.selectList(wrapper);
System.out.println(users.toString());
}
????????
? ? ? ? 总结:AbstractWrapper为我们提供了众多条件判断方法,用于生成 sql 的 where 条件。而QueryWrapper和UpdateWrapper继承自AbstractWrapper,同时QueryWrapper提供了select方法,AbstractWrapper提供了set方法,而LambdaQueryWrapper 和 LambdaUpdateWrapper 是相对于 QueryWrapper 及 UpdateWrapper 的 Lmbda 语法实现方式(用函数替代方法中的字段,避免硬编码)。
? ? ? ? 因此,在以上介绍的众多条件构造器中,日常使用到的只有两个:LambdaQueryWrapper和LambdaUpdateWrapper。当遇到特殊的更新(如:blance = blance -200),可以使用UpdateWrapper。如果是简单的直接赋值,或者其他操作可以使用QueryWrapper。(本质就是select和set语句的选择)