快捷搜索: 王者荣耀 脱发

乐观锁的实现——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值你知道,不然还是直接从数据库查一下为好。

经验分享 程序员 微信小程序 职场和发展