自动填充

  • 需求:业务中表有更新时间、创建时间、创建人、更新人等字段。可以使用 @TableField(fill = )来进行自动填充。
  • 加了注解的字段会在SQL中预留字段,属性值指定 在进行什么操作的时候需要预留字段。
  • 第一步,在字段上添加注解
//插入和更新的时候
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
  • 第二步,自定义填充处理器MetaObjectHandler

在config包中,新增自定义填充处理类。

/**
 * @author Cagur
 * @version 1.0
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        //执行插入的时候
        this.setFieldValByName("createTime",LocalDateTime.now(),metaObject);
        this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);
    }
}

逻辑删除

mybatis支持逻辑删除,只需要配置好逻辑删除的实体字段名,代表删除的字段值和代表未删除的字段值后即可。

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: delFlag  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

乐观锁

  • 需求:并发操作的时候,我们需要保证对数据操作不发生冲突。
  • 原理:使用乐观锁时,一般在表中家一个version列,用来记录对每次记录操作的版本。每次对某条记录进行操作,对应version会++。
    • 更新操作的时候,先查询version,执行更新时候,set version = 老版本+1 where version=老版本
    • 如果在查询老版本到更新中间有人更新了这条数据,就会更新失败。
  • 这些更新version的操作由mybatis plus来完成。

配置

第一步,配置类。

    /**
     * 乐观锁
     */
    @Bean
    public MybatisPlusInterceptor optimisticLockerInnerInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }

第二步,字段加上 @Version注解。

@Version
private Integer version;

多插件配置问题

前面配置了两个插件:分页插件和乐观锁插件。
不推荐注入两个方法,而是在一个方法中,用add方法添加拦截器。

顺序:

  • 多租户、动态表名
  • 分页、乐观锁
  • sql性能规范、防止全表更新和删除