目录
1 前言
Mybatis plus自带的各种简单的mapper层方法及条件构造器,已经能够满足我们绝大多数的需求,但是一些特殊的情况使得我们仍然需要自定SQL。
比如说:当一些特殊的情况需要我们在条件构造器中使用setSql()函数时,诚然我们可以直接在里面写方法,如下,但是在业务层中写SQL语句这并不符合我们的业务规范。
new UpdateWrapper<User>().setSql("balance = balance - 100");
又比如说我们需要给查询出来的参数其别名,如下,这样即使是条件构造器也帮不了我们。
select count(id) as total from user;
接下来,我将介绍自定义SQL的解决办法,来为大家排忧解难。(本文参考自黑马程序员)
2 使用方法
例子:
UPDATE user
SET balance = balance - 100
WHERE id in (1, 2)
2.1 构建where条件
虽然对于一些特殊情况,我们不能仅仅使用条件构造器来解决问题了,但是条件构造器仍然能完美的解决where条件部分。因此,我们可以将完整的SQL分为两个部分来实现,一部分是我们的自定义SQL,另一部分仍然由我们的条件构造器来实现。
List<Long> ids = List.of(1L, 2L);
int amount = 100;
// 1.构建条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
// 2.自定义SQL方法调用
userMapper.updateBalanceByIds(wrapper, amount);
2.2 mapper方法参数中用Param注解声明变量名称
注意:wrapper必须是"ew",也可以使用MP自带的常量类Constants.WRAPPER
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
2.3 使用Wrapper条件
Wrapper条件使用${ew.customSqlSegment}引入
<update id="updateBalanceByIds">
UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>