MybatisPlus-自动填充乐观锁

自动填充

创建时间和修改时间,gmt_create, gmt_modified

方法一:数据库级别(工作中不建议使用,因为无法直接操作数据库)

1、直接在数据库表中新增字段

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

2、更新实体类与数据库对应

private Date gmtCreate;
private Date gmtModified;

3、更新测试
在这里插入图片描述

方式二:代码级别(推荐)

  1. 删除数据库中的默认值和更新操作

  2. 给实体类字段属性上加注解

    //插入的时候自动填充
    @TableField(fill = FieldFill.INSERT)
    private Date gmtCreate;
    //插入和更新的时候自动填充
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date gmtModified;
    
  3. 编写处理器来处理这个注解

  4. 新建 handle 包创建处理器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);
      }
    }
    

乐观锁

当准备更新一条记录时,希望这条记录这个时候没有被别人更新

扫描二维码关注公众号,回复: 16223300 查看本文章
  • 取出记录时,获取当前 version
  • 更新时,带上这个 version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果 version 不对,就更新失败
  1. 数据库增加 version 字段,默认为 1,int 类型,长度为 10
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b4pHTBD1-1691480640840)(/Users/tong/Downloads/image-20230625162628202.png)]

  2. 实体类添加 version 属性

    @Version
    private Integer version;
    
  3. 注册组件

    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. 测试

    //测试没有通过乐观锁
    @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);
    }
    

猜你喜欢

转载自blog.csdn.net/Xiao_tongtong/article/details/132168415