乐观锁使用场景很多,这里讲讲乐观锁在MyBatis Plus上的具体实现。
首先要在数据库表中添加version字段,并给version字段设置初始值1 。
然后需要MyBatis Plus的依赖,这里使用是3.4.0的版本
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
然后实体类中要添加字段与相应注解
@Version
private Integer version;
此外还需要一个配置类,配置类有两种写法
一种是老版本的写法,在新版本已经弃用了,但是还可以用,具体如下
/**
* @author
* @create 2021-02-21
*/
@Configuration
@MapperScan("com.example.mapper")
public class MybatisPlusConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
新版本是下面这样的(推荐)
@Configuration
@MapperScan("com.example.mapper")
public class MybatisPlusConfig {
/**
* 新版MyBatisPlus3.4配置
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//乐观锁配置
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
注意,一个是OptimisticLockerInterceptor一个是OptimisticLockerInnerInterceptor,仔细看清楚不一样的。
这些都做完了之后,写业务层。
@RestController
@RequestMapping("/versionTest")
@Api(value = "versionTest")
public class VersionTestController {
@Autowired
private VersionTestService versionTestService;
@PostMapping(value = "/add")
@ApiOperation(value = "添加")
public Result addVersionTest(@RequestBody VersionTest versionTest){
boolean save = versionTestService.save(versionTest);
return new Result().ok(save);
}
@PostMapping("/update")
@ApiOperation(value = "更新")
public Result updateVersionTest(@RequestParam(value = "id")Integer id,@RequestParam(value = "value")Integer value){
VersionTest versionTest = versionTestService.getById(id);
versionTest.setValue(value);
boolean update = versionTestService.update(versionTest,new UpdateWrapper<VersionTest>().eq("id",id));
return new Result().ok(update);
}
}
这里图方便直接在Controller层写了,用的是Service的CRUD接口。
添加肯定是都没问题的,数据库增加一行数据后,version初始值就是1,关键是更新。上面代码是正确写法,更新后version也更新为2 。
但是像下面的更新操作就有问题了
@PostMapping("/update")
@ApiOperation(value = "更新")
public Result updateVersionTest(@RequestBody VersionTest versionTest){
boolean update = versionTestService.update(versionTest,null);
return new Result().ok(update);
}
不建议直接把实体类传参,除非实体类里面的version值你知道,不然还是直接从数据库查一下为好。