首页 > 其他分享 >mybatisplus乐观锁拦截器批量更新

mybatisplus乐观锁拦截器批量更新

时间:2024-04-26 19:22:05浏览次数:23  
标签:拦截器 mybatisplus 批量 Object update new import

在MyBatis-Plus中使用乐观锁拦截器进行批量更新时,需要注意乐观锁的使用方式。乐观锁通常通过版本号机制实现,即在数据库表中增加一个版本号字段,每次更新时都会将版本号加一。

下面是一个使用MyBatis-Plus的乐观锁拦截器处理批量更新的示例:

首先,你需要自定义一个拦截器,实现Interceptor接口:

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.update.Update;
 
import java.util.List;
 
public class OptimisticLockInnerInterceptor implements InnerInterceptor {
    @Override
    public void beforeUpdate(Executor executor, MappedStatement ms, Update update, List<BatchResult> batchResults) {
        String tableName = update.getTables().get(0).getName();
        for (BatchResult batchResult : batchResults) {
            Object param = batchResult.getParameter();
            if (param instanceof MapperMethod.ParamMap) {
                MapperMethod.ParamMap paramMap = (MapperMethod.ParamMap) param;
                Object entity = paramMap.get("et"); // et is the default key for entity
                if (entity != null) {
                    String versionColumn = "version"; // Assuming your version column name is "version"
                    Object versionValue = getFieldValue(entity, versionColumn);
                    if (versionValue != null) {
                        Expression versionExpression = new Expression(new Column(versionColumn), new ExpressionList(String.valueOf(versionValue)), null);
                        update.getColumns().add(new Column(versionColumn));
                        update.getExpressions().add(versionExpression);
                    }
                }
            }
        }
    }
 
    private Object getFieldValue(Object obj, String fieldName) {
        // Implement your method to get field value
    }
}

  然后,你需要在MyBatis-Plus的配置中添加这个拦截器:

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockInnerInterceptor());
        return interceptor;
    }
}

  在实体类中,确保有版本号字段,并使用@Version注解:

import com.baomidou.mybatisplus.annotation.Version;
 
public class YourEntity {
    // ... other fields ...
 
    @Version
    private Integer version;
 
    // Getters and Setters
}

  在执行批量更新时,MyBatis-Plus会自动处理乐观锁。注意,这里的getFieldValue方法需要你根据实体类的实际字段名和获取方法进行实现。

标签:拦截器,mybatisplus,批量,Object,update,new,import
From: https://www.cnblogs.com/xianz666/p/18160730

相关文章

  • mybatisplus乐观锁实现批量更新(在sql中实现)
    mybatisplus乐观锁实现批量更新在MyBatis-Plus中,乐观锁通常用于处理并发更新数据的问题。乐观锁实现批量更新时,可以使用版本号或者时间戳来保证数据的一致性。以下是使用乐观锁实现批量更新的示例代码:首先,在你的实体类中添加版本号字段:importcom.baomidou.mybatis......
  • mybatisplus乐观锁(单个任务)
    乐观锁:在关系数据库管理系统里,乐观并发控制(又名“乐观锁”,OptimisticConcurrencyControl,缩写“OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务......
  • MyBatisPlus乐观锁批量更新
    MyBatis-Plus提供了乐观锁插件 OptimisticLockerInterceptor 用于处理乐观锁,但是对于批量更新操作,乐观锁插件默认不会生效。要实现批量更新时的乐观锁控制,你需要自定义批量更新的逻辑。以下是一个自定义批量更新并使用乐观锁的示例:@ServicepublicclassYourService{......
  • SpringBoot+MyBatisPlus报错 Invalid value type for attribute 'factoryBeanObjectTy
    依赖版本org.springframework.boot:spring-boot-starter-web:3.2.5com.baomidou:mybatis-plus-boot-starter:3.5.5错误Invalidvaluetypeforattribute'factoryBeanObjectType'问题原因:这个问题是由于依赖传递导致,在MyBatis起步依赖中的myBatis-spring版本过低,导致程......
  • [python省时间]处理文档,包括批量查找,替换,
    1、批量查找替换#-*-coding:utf-8-*-importosimportre#path=os.getcwd()str_old='insert'str_new='frs.event.queue'file_formate='init.sql'file_sql=open(r'F:\bak\init_all.sql','r+',encoding=......
  • ES: 数据增,删,改,批量操作
    参考文章:https://blog.csdn.net/zhuchunyan_aijia/article/details/129461431 1>指定id新增_id=1新增一条,此命令重复执行,就是更新id=1的数据POSTemployee_zcy/_doc/1{"uid":"1234","phone":"12345678909","message"......
  • 利用expect交互批量修改普通用户过期密码
    因为公司接了一个密码托管的活,有10000多台机器,系统有openSUSE,SUSE,Ubuntu,centos,Oracle-Linux,而且什么版本都有,不给root权限,密码已经过期很多,先用expect的方式把过期密码修改完成,在进行托管#!/bin/bash#Author:shsnc-****#Time:2021-5-11#Name:for_user.sh#Version:V1.3#D......
  • springboot+mybatisplus+dynicDatasource 从数据库表中查询数据源 动态添加
    1、pom依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/><!--lookuppa......
  • dotnet 使用 windbg 运行脚本方式自动批量调试处理 dump 文件
    本文将和大家介绍一个简单且实际用途不大的使用windbg配合脚本的方式,进行自动化的大批量对dotnet系应用的dump进行自动化分析调试处理,可以自动根据调试需求输出dump文件的一些信息利用windbg执行调试脚本的能力,可以实现自动化调试dump文件,将调试dump文件获取的信息......
  • Spring MVC拦截器实现,记录访问请求日志
    SpringMVC拦截器实现,记录访问请求日志1.创建拦截器类并实现HandlerInterceptor拦截器packagecom.jxdinfo.hussar.sys.interceptor;importcom.jxdinfo.hussar.base.entity.UserInfo;importcom.jxdinfo.hussar.common.util.UserUtils;importcom.jxdinfo.hussar.core.util......