目录
前言:
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字段取排序 获取最大的一条数据
LambdaQueryWrapper<RuleDO> wrapper = queryWrapper.eq(RuleDO::getId, RuleResultDO.getRuleCode())
.orderByDesc(RuleDO::getVersion)
.last("limit 1").select();
它创建了一个LambdaQueryWrapper对象,用于构建查询条件。其中:
- eq() 方法设置查询条件,要求
RuleDO
对象的id
属性等于RuleResultDO.getRuleCode()
的值。 - orderByDesc() 方法按照
version
属性降序排列结果。 - last() 方法指定查询条件的最后一部分,这里是限制只返回一条结果。
- select() 方法表示查询结果需要返回整个
RuleDO
对象。
小课堂知识讲解:
FOR UPDATE
是一个 SQL 语句,用于在事务中锁定查询结果集中的行,以防止其他事务对这些行进行修改或删除。主要用于以下场景:
-
避免并发冲突:在并发场景下,多个事务可能同时访问同一行数据,如果没有锁定机制,可能会出现数据不一致的问题,而使用
FOR UPDATE
可以避免并发冲突。 -
避免脏读:在某些场景下,需要先读取数据再更新数据,如果没有锁定机制,可能会出现脏读的问题,而使用
FOR UPDATE
可以避免脏读。 -
实现乐观锁:在使用乐观锁的情况下,需要先读取数据,判断版本号是否正确,再更新数据。如果版本号不正确,则说明其他事务已经修改了数据,这时候可以抛出异常或重试。使用
FOR UPDATE
可以在读取数据时就锁定行,避免出现并发修改。
需要注意的是,使用 FOR UPDATE
会对性能产生一定的影响,因为它会锁定数据库中的行,其他事务无法修改这些行,直到当前事务提交或回滚。因此,在使用 FOR UPDATE
时需要权衡性能和并发性。