MybatisPlus: rellena automáticamente bloqueos optimistas

autocompletar

hora de creación y hora de modificación, gmt_create, gmt_modified

Método 1: nivel de base de datos (no recomendado para el trabajo, porque la base de datos no se puede manipular directamente)

1. Agregar campos directamente en la tabla de la base de datos

gmt_create datetime类型 默认值CURRENT_TIMESTAMP
 
gmt_modified  datetime类型 默认值CURRENT_TIMESTAMP  勾选“根据当前时间戳更新”

2. Actualice la clase de entidad para que corresponda a la base de datos

private Date gmtCreate;
private Date gmtModified;

3. Prueba de actualización
inserte la descripción de la imagen aquí

Método 2: nivel de código (recomendado)

  1. Operaciones DELETE DEFAULT y UPDATE en la base de datos

  2. Anotar propiedades de campo de clase de entidad

    //插入的时候自动填充
    @TableField(fill = FieldFill.INSERT)
    private Date gmtCreate;
    //插入和更新的时候自动填充
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date gmtModified;
    
  3. Escriba un procesador para manejar esta anotación

  4. Nuevo procesador de creación de paquetes de identificadores MyMetaObjectHandler

    package swagger.handler;
    
    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import org.apache.ibatis.reflection.MetaObject;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    
    /**
     * @Author yetong
     * @Date 2023-06-25 16:07
     * @blog https://blog.csdn.net/Xiao_tongtong
     **/
    
    //把处理器加到 IOC 容器中
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
          
          
    
      //插入时的填充策略
      @Override
      public void insertFill(MetaObject metaObject) {
          
          
        this.setFieldValByName("gmtCreate",new Date(),metaObject);
        this.setFieldValByName("gmtModified",new Date(),metaObject);
      }
      //更新时的填充策略
      @Override
      public void updateFill(MetaObject metaObject) {
          
          
        this.setFieldValByName("gmtModified",new Date(),metaObject);
      }
    }
    

candado optimista

Al prepararse para actualizar un registro, se espera que este registro no haya sido actualizado por otros en este momento.

  • Al buscar registros, obtener la versión actual
  • Al actualizar, traer esta versión
  • Al realizar una actualización, configure version = newVersion donde version = oldVersion
  • Si la versión es incorrecta, la actualización fallará
  1. La base de datos agrega un campo de versión, el valor predeterminado es 1, tipo int y la longitud es 10
    [Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-b4pHTBD1-1691480640840)(/Users/tong/Downloads/image-20230625162628202.png )]

  2. Agregar atributo de versión a la clase de entidad

    @Version
    private Integer version;
    
  3. registrar componente

    package swagger.config;
    
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    /**
     * @Author yetong
     * @Date 2023-06-25 14:39
     * @blog https://blog.csdn.net/Xiao_tongtong
     **/
    @MapperScan("swagger.mapper")
    @Configuration
    //自动管理事务
    @EnableTransactionManagement
    public class MybatisPlusConfig {
          
          
    
      //注册乐观锁插件
      @Bean
      public MybatisPlusInterceptor mybatisPlusInterceptor() {
          
          
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
      }
    }
    
  4. prueba

    //测试没有通过乐观锁
    @Test
    public void TestUpdate(){
          
          
    
      //模拟线程 1 执行一个更新操作
      Users users = usersMapper.selectById(1L);
      users.setName("yetong111");
      users.setEmail("[email protected]");
      usersMapper.updateById(users);
    
      //此时还没有提交更新,然后线程 2 介入,直接提交更新
      Users user = usersMapper.selectById(1L);
      user.setName("yetong2222");
      user.setEmail("[email protected]");
      usersMapper.updateById(user);
    
      //没有乐观锁的话,现在数据已经变成yetong222,线程 1提交后会覆盖成yetong111
      usersMapper.updateById(users);
    
    }
    
    
    //通过乐观锁
    @Test
    public void testOptimisticLocker(){
          
          
      Users users = usersMapper.selectById(1L);
      users.setName("yetong");
      users.setEmail("[email protected]");
      usersMapper.updateById(users);
    }
    

Supongo que te gusta

Origin blog.csdn.net/Xiao_tongtong/article/details/132168415
Recomendado
Clasificación