mybatisplus的ServiceImpl提供的两个lambda方法,lambdaQuery和lambdaUpdate

时间:2024-03-13 08:56:47

lambdaQuery()lambdaUpdate().这两个方法相比LambdaQueryWrapperLambdaUpdateWrapper的好处是可以直接.list获.one,当然他们的功能是差不多的。主要用于构造sql语句的where条件的。
1.lambdaQuery()的使用方法
lambdaQuery()返回的是一个Wrapper对象
对于复杂条件的查询,使用lambdaUpdate()进行构建查询。简单的直接用ServiceImpl的get方法就行了。

//select * from tb_user WHERE (username LIKE ? AND status = ? AND balance >= ? AND balance <= ?)
        List<User> list = lambdaQuery()
                .like(name != null, User::getUsername, name)
                .eq(status != null, User::getStatus, status)
                .ge(minBalance != null, User::getBalance, minBalance)
                .le(maxBalance != null, User::getBalance, maxBalance)
                .list();

2.lambdaUpdate()的使用方法
对于复杂条件的更新,使用lambdaUpdate()进行构建更新。简单的直接用ServiceImpl的update方法就行了。

@Override
@Transactional
public void deductBalance(Long id, Integer money) {
    // 1.查询用户
    User user = getById(id);
    // 2.校验用户状态
    if (user == null || user.getStatus() == 2) {
        throw new RuntimeException("用户状态异常!");
    }
    // 3.校验余额是否充足
    if (user.getBalance() < money) {
        throw new RuntimeException("用户余额不足!");
    }
    // 4.扣减余额 update tb_user set balance = balance - ? , status = ? where(id = ?, balance = ?)
    int remainBalance = user.getBalance() - money;
    lambdaUpdate()
            .set(User::getBalance, remainBalance) // 更新余额
            .set(remainBalance == 0, User::getStatus, 2) // 动态判断,是否更新status
            .eq(User::getId, id)
            .eq(User::getBalance, user.getBalance()) // 乐观锁
            .update();
}