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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值