由于SQL不能写在业务层,所以可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分
①基于Wrapper 构建Where条件
@Test
public void test7(){
//需求:将id满足ids的数据项的balance字段减200
int amount=200;
List<Long> ids=List.of(1L, 2L,3L);
//构建条件,使用Lambda 形式获取参数类型
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
//调用自定义方法
userMapper.updateBalanceByIds(wrapper, amount);
}
②在mapper方法中使用Param注解声明wrapper变量名称,必须是ew
@Mapper
public interface UserMapper extends BaseMapper<User> {
/*自定义SQL
在mapper方法的参数中使用@Param注解Wrapper变量名称,且名称必须为ew
使用 ew 作为命名是为了统一约定,通常表示 "Entity Wrapper",这样可以直接在 SQL 语句中使用 ${ew} 作为查询条件的占位符。
*/
void updateBalanceByIds(@Param("ew")LambdaQueryWrapper<User> wrapper,@Param("amount") int amount);
}
③自定义SQL,并且使用Wrapper条件
<mapper namespace="com.example.demo.mapper.UserMapper">
<update id="updateBalanceByIds">
UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>
</mapper>