数据填充
数据填充是huiche提供的一项功能,可以分别在执行dao的insert和update系列方法时进行数据填充 在insert时,使用fill功能, 可以实现类似自管理主键的功能
填充功能依赖于@FillOnInsert和@FillOnUpdate注解,和Generator接口,了解内置注解
实现步骤
声明并实现一个值生成器
根据需要,实现generateOnInsert或generateOnUpdate方法
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一定要把FillOnInsert的populate设为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标注的列的数据填充,更新到数据库,更新时不会回填数据到实体类中