Skip to content

数据填充

数据填充是huiche提供的一项功能,可以分别在执行dao的insertupdate系列方法时进行数据填充 在insert时,使用fill功能, 可以实现类似自管理主键的功能

填充功能依赖于@FillOnInsert@FillOnUpdate注解,和Generator接口,了解内置注解

实现步骤

声明并实现一个值生成器

根据需要,实现generateOnInsertgenerateOnUpdate方法

java
@Component//使用starter时,注册为bean会自动注册到配置中
public class UUIDGenerator implements Generator {
    @Override
    public Object generateOnInsert(ColumnMetadata column, Object currentVal, Object source) {
        return UUID.randomUUID().toString();
    }
}
@Component
public class TimeGenerator implements Generator {
    @Override
    public Object generateOnInsert(ColumnMetadata columnMetadata, Object currentVal, Object source) {
        return System.currentTimeMillis();
    }
    @Override
    public Object generateOnUpdate(ColumnMetadata columnMetadata, Object currentVal, Object source) {
        return System.currentTimeMillis();
    }
}

说明

  • 生成器的返回类型为Object,允许返回Expression系列对象,比如可以让generateOnUpdate返回Column.of(Song::version).plus(1), 则代表每次更新时该列的值相对之前+1
  • 注意返回Expression时,无法回填数值到实体类,所以使用generateOnInsert返回Expression 一定要把FillOnInsertpopulate设为false

给实体类的属性添加注解

根据需要添加@FillOnInsert@FillOnUpdate(允许同时添加)

java
public class Song{
    @Column(primaryKey = true)
    @FillOnInsert(UUIDGenerator.class)
    private String id;

    private String title;

    @FillOnInsert(TimeGenerator.class)
    private Long createTime;

    @FillOnInsert(TimeGenerator.class)
    @FillOnUpdate(TimeGenerator.class)
    private Long updateTime;
}

说明

  • 调用dao的insert,insertWith,insertBatch等方法时,会自动进行@FillOnInsert标注的列的数据填充,插入到数据库,并回填到插入使用的实体类中(需要非record,record是final无法写入,如果插入使用非实体类而是VO类也不会回填)
  • 调用dao的update,updateWith等方法时,会自动进行@FillOnUpdate标注的列的数据填充,更新到数据库,更新时不会回填数据到实体类中