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


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

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

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

    在这里插入图片描述

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

    @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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    @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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    AD教程 (八)器件的复制和对齐
    redis 哨兵,高可用的执行者
    【深圳1024开发者城市聚会定向征文】
    spirngboot项目 使用AOP限流用户单位时间请求接口次数
    Spring进阶(AOP的应用)—— 动态代理AOP后controller层的private方法访问失效的问题
    简直了,被“Java并发锁”问题追问到自闭...
    c++四种强制类型转换
    NextJS开发:shadcn/ui中Button组件扩展增加图标
    【论文阅读】ACM MM 2023 PatchBackdoor:不修改模型的深度神经网络后门攻击
    为什么 CSS flex 布局中没有 `justify-items` 和 `justify-self`?
  • 原文地址:https://blog.csdn.net/qq_19891197/article/details/134430159