@Version乐观锁配置mybatis-plus使用(version)

1:首先在实体类的属性注解上使用@Version

java 复制代码
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.util.Date;

/**
 * @Description: 访客数据
 * @Author: xqf
 * @Date:   2023-07-27
 * @Version: V1.0
 */
@Data
@TableName("sys_visitant_data")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="sys_visitant_data对象", description="访客数据")
public class SysVisitantData {

	/**id*/
	@TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "id")
	private String id;
	/**访客openId*/
	@Excel(name = "访客openId", width = 15)
	@ApiModelProperty(value = "访客openId")
	private String visitantOpenId;
	@Version
	private Long version;
}

2:在数据库表中添加version字段,注意实体类使用是long和int类型(和默认值为0)

3:在mybatis-plus拦截器中添加OptimisticLockerInnerInterceptor()乐观锁拦截器

java 复制代码
@Configuration
@MapperScan(value={"org.demo.modules.**.mapper*"})
public class MybatisConfig {
@Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor= new MybatisPlusInterceptor();
        //添加分页拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //添加乐观锁拦截器
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

4:demo(version字段版本会自动每次加一操作)

java 复制代码
@PostMapping("/apply2")
    public Result<?> apply2() {
        SysVisitantData visitantData = sysVisitantDataService.getById("1724065295435689986");
        Integer visitantNumber = visitantData.getVisitantNumber();
        System.out.println("开始#2:" + visitantNumber);
        visitantData.setVisitantNumber(visitantNumber + 5);
        boolean flag = sysVisitantDataService.updateById(visitantData);
        if (!flag){
            throw new JeecgBootException("2保存失败");
        }
        System.out.println("更新#2:" + visitantData.getVisitantNumber());
        return Result.OK();
    }
相关推荐
benchmark_cc3 分钟前
实时行情系统如何避免无意义的重复请求?从请求去重到缓存设计
大数据·开发语言·python·pandas·量化交易·股票数据·quantdash
田里的水稻4 分钟前
Python_两大法宝dir() 与 help() 的妙用
开发语言·python
郝学胜-神的一滴6 分钟前
Python浏览器自动化:Selenium与Playwright实战对比,网页爬虫&自动操作一站式指南
开发语言·爬虫·python·selenium·程序人生·自动化
金銀銅鐵9 分钟前
[Java] 用 GUI 展示 ArrayList 扩容的过程
java·后端·ai编程
土豆.exe10 分钟前
chunked 编码的行尾:Go、h11 与 Tomcat 各错在哪一处
开发语言·网络安全·golang·tomcat
磊 子11 分钟前
什么是虚假唤醒(spurious wakeup)?从 POSIX 标准讲到 futex 内核
java·开发语言
飘然生22 分钟前
traceId链路 skywalking java agent
java·开发语言·skywalking
li星野24 分钟前
【学习记录】射线补偿原理与实现:从物理模型到MATLAB代码
开发语言·学习·matlab
IT研究室29 分钟前
最新计算机毕业设计选题推荐-基于spring boot的母婴全程服务管理系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
CRMEB37 分钟前
商品 SKU 设计,从简单规格到多规格踩过什么
java·前端·数据库·开源