目录
? ? ? ? 介绍:自定义SQL并不是由我们来编写全部SQL语句,而是通过利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
? ? ? ? 使用需求:如果我们想要对数据库某字段进行直接赋值,那么可以在Mapper层或者.xml层编写对应的SQL语句。如果我们要对数据库某字段进行特殊赋值或者动态赋值,又或者其他复杂的操作,如:更新字段balance=balance+20,我们不得不在业务层进行编写,而这样会导致代码编写不符合规范(SQL语句需要在Mapper层中编写),但直接编写SQL语句又十分冗长麻烦。因此我们可以使用自定义SQL的功能,将where条件交给MP编写,而剩余的Update、Select等语句由我们自定义编写(如下图所示)。
????????自定义SQL方法在业务层定义where条件和需要使用的参数,并将where条件与参数传入自定义Mapper方法中,最后在Mapper方法或者xml文件中自定义编写剩余的SQL语句。?
?
通过自定义SQL实现如下SQL语句:
update tb_user set balance = balance - 200 WHERE (id IN (1,2,4))
/*Service层*/
@Test
void testCustomSqlUpdate() {
//1. 设置更新条件
List<Long> ids = List.of(1L, 2L, 4L);
int amount = 200;
//2. 定义where条件
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
//3. 调用自定义SQL方法
userMapper.updateBalanceByIds(wrapper, amount);
}
/*Mapper层*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
//如果忘记"ew"可以用WRAPPER的常量代替:@Param(Constants.WRAPPER)
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper wrapper, @Param("amount") int amount);
}
<!-- xml文件 -->
<update id="updateBalanceByIds">
update tb_user set balance = balance - #{amount} ${ew.customSqlSegment}
</update>
????????总结:自定义SQL方法在业务层定义where条件和需要使用的参数,并将where条件与参数传入自定义Mapper方法中,最后在Mapper方法或者xml文件中自定义编写剩余的SQL语句。
????????使用场景:当遇到SQL语句中,除where条件之外的语句很难用MP编写的情况下,可以使用自定义SQL。