[Mybatis-plus插件如何根据其他属性值修改数据 /根据其他属性去查询数据]

文章介绍了如何使用MyBatis-Plus的UpdateWrapper和LambdaUpdateWrapper构建更新条件,以及LambdaQueryWrapper建立查询条件来获取数据。通过示例代码展示了根据属性值更新记录、查询单条记录以及获取特定排序下的第一条数据的方法。此外,还提到了FORUPDATE在并发控制中的作用。
摘要由CSDN通过智能技术生成

 

目录

前言:

update

update2

查询条数:

根据入参查询数据,然后获取对应属性排序最大的第一条数据:

小课堂知识讲解:



前言:

   记录一下, mybatis-plus 除了主键去修改数据/或者查询数据  使用其他属性去操作的场景

update

  • 可以使用UpdateWrapper或LambdaUpdateWrapper构建更新条件,然后将条件传入UpdateChainWrapper的update方法中。
  • 例如,假设有一个实体类User,有id、name和age三个属性,需要根据name和age的值来更新记录,可以使用以下代码实现:
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "张三").eq("age", 20);

UpdateChainWrapper<User> updateChainWrapper = new UpdateChainWrapper<>(userMapper);
updateChainWrapper.update().set("name", "李四").set("age", 25).apply(updateWrapper);

描述:UpdateWrapper用于构建更新条件,eq方法用于设置属性值与指定值相等的条件。UpdateChainWrapper则用于更新操作,update方法返回UpdateWrapper,然后通过set方法设置需要更新的属性值,apply方法将更新条件传入进行更新操作。

update2

  • 除了使用UpdateWrapper或LambdaUpdateWrapper构建更新条件,还可以使用EntityWrapper或LambdaQueryWrapper构建查询条件,然后将查询条件转化为更新条件,再传入UpdateChainWrapper的update方法中。
  • 例如,假设有一个实体类User,有id、name和age三个属性,需要根据name和age的值来更新记录,可以使用以下代码实现:
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getName, "张三").eq(User::getAge, 20);

User updateUser = new User();
updateUser.setName("李四");
updateUser.setAge(25);

UpdateChainWrapper<User> updateChainWrapper = new UpdateChainWrapper<>(userMapper);
updateChainWrapper.update(updateUser, Wrappers.lambdaUpdate(User.class).apply(queryWrapper));

描述: LambdaQueryWrapper用于构建查询条件,eq方法用于设置属性值与指定值相等的条件。updateUser表示要更新的属性值,Wrappers.lambdaUpdate(User.class)用于将Lambda表达式转化为UpdateWrapper,apply方法将查询条件传入进行更新操作。

查询条数:

  • this.getOne(queryWrapper, true) 方法是 MyBatis-Plus 提供的查询方法,用于查询符合条件的一条记录。
  • 其中,queryWrapper表示查询条件,true表示查询出来的结果集只有一条记录。如果设置为false,则表示查询出来的结果集可能有多条记录,返回结果为第一条记录,如果查询结果为空,则返回null。

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getName, "张三").eq(User::getAge, 20);

User user = this.getOne(queryWrapper, true);

描述: LambdaQueryWrapper用于构建查询条件,eq方法用于设置属性值与指定值相等的条件,this指代当前的Service类,getOne表示查询符合条件的一条记录,queryWrapper表示查询条件,true表示查询出来的结果集只有一条记录。

如果查询结果为空,则返回null,如果查询结果不为空,则返回符合条件的第一条记录。

根据入参查询数据,然后获取对应属性排序最大的第一条数据:

根据B表的参数查询A表的数据 然后根据A表的version字段取排序  获取最大的一条数据
       lRuleDO controlRuleDO = ruleService.getOne(new LambdaQueryWrapper<RuleDO>()
                    .eq(RuleDO::getCode, ResultDO.getRuleCode())
                    .orderByDesc(lRuleDO::getVersion)
                    .last("limit 1"));

它使用了LambdaQueryWrapper构造了一个查询条件,查询RuleDO表中code等于controlRuleResultDO.getRuleCode()的记录,并按照version字段降序排序,最后取第一条记录。

具体来说,这段代码的实现步骤如下:

  1. 调用ruleService的getOne方法,该方法返回RuleDO表中符合条件的一条记录,如果没有符合条件的记录,则返回null。

  2. 使用LambdaQueryWrapper构造查询条件,eq方法表示等于,orderByDesc方法表示按照version字段降序排序,last方法表示在SQL语句的最后添加额外的语句,这里是"limit 1",表示只取一条记录。

  3. 将构造好的查询条件作为参数传递给getOne方法,执行查询操作。

需要注意的是,LambdaQueryWrapper是MyBatis-Plus提供的一个查询构造器,可以方便地进行复杂的查询操作。在使用LambdaQueryWrapper时,需要在MyBatis-Plus中配置相应的依赖和配置文件。

小课堂知识讲解:

FOR UPDATE 是一个 SQL 语句,用于在事务中锁定查询结果集中的行,以防止其他事务对这些行进行修改或删除。主要用于以下场景:

  1. 避免并发冲突:在并发场景下,多个事务可能同时访问同一行数据,如果没有锁定机制,可能会出现数据不一致的问题,而使用 FOR UPDATE 可以避免并发冲突。

  2. 避免脏读:在某些场景下,需要先读取数据再更新数据,如果没有锁定机制,可能会出现脏读的问题,而使用 FOR UPDATE 可以避免脏读。

  3. 实现乐观锁:在使用乐观锁的情况下,需要先读取数据,判断版本号是否正确,再更新数据。如果版本号不正确,则说明其他事务已经修改了数据,这时候可以抛出异常或重试。使用 FOR UPDATE 可以在读取数据时就锁定行,避免出现并发修改。

需要注意的是,使用 FOR UPDATE 会对性能产生一定的影响,因为它会锁定数据库中的行,其他事务无法修改这些行,直到当前事务提交或回滚。因此,在使用 FOR UPDATE 时需要权衡性能和并发性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是汤圆丫

怎么 给1分?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值