目录
前言:
记录一下, 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字段降序排序,最后取第一条记录。
具体来说,这段代码的实现步骤如下:
-
调用ruleService的getOne方法,该方法返回RuleDO表中符合条件的一条记录,如果没有符合条件的记录,则返回null。
-
使用LambdaQueryWrapper构造查询条件,eq方法表示等于,orderByDesc方法表示按照version字段降序排序,last方法表示在SQL语句的最后添加额外的语句,这里是"limit 1",表示只取一条记录。
-
将构造好的查询条件作为参数传递给getOne方法,执行查询操作。
需要注意的是,LambdaQueryWrapper是MyBatis-Plus提供的一个查询构造器,可以方便地进行复杂的查询操作。在使用LambdaQueryWrapper时,需要在MyBatis-Plus中配置相应的依赖和配置文件。
小课堂知识讲解:
FOR UPDATE
是一个 SQL 语句,用于在事务中锁定查询结果集中的行,以防止其他事务对这些行进行修改或删除。主要用于以下场景:
-
避免并发冲突:在并发场景下,多个事务可能同时访问同一行数据,如果没有锁定机制,可能会出现数据不一致的问题,而使用
FOR UPDATE
可以避免并发冲突。 -
避免脏读:在某些场景下,需要先读取数据再更新数据,如果没有锁定机制,可能会出现脏读的问题,而使用
FOR UPDATE
可以避免脏读。 -
实现乐观锁:在使用乐观锁的情况下,需要先读取数据,判断版本号是否正确,再更新数据。如果版本号不正确,则说明其他事务已经修改了数据,这时候可以抛出异常或重试。使用
FOR UPDATE
可以在读取数据时就锁定行,避免出现并发修改。
需要注意的是,使用 FOR UPDATE
会对性能产生一定的影响,因为它会锁定数据库中的行,其他事务无法修改这些行,直到当前事务提交或回滚。因此,在使用 FOR UPDATE
时需要权衡性能和并发性。