乐观锁的实现——MyBatisPlus学习笔记
乐观锁使用场景很多,这里讲讲乐观锁在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值你知道,不然还是直接从数据库查一下为好。
上一篇:
IDEA上Java项目控制台中文乱码