再版はソースを示します~~
mybatis-plus の自動入力機能についてはあまり紹介しませんが (公式サイトのポータル ==> )、公式サイトにある例は、createTime や updateTime などの固定フィールド名に基づいて判断して入力します。一定の制限がありますが、次のような状況では適用できない場合があります
。
/**
* 创建时间
*/
@TableField(value = "aasy04a040",fill=FieldFill.INSERT)
@ApiModelProperty(value = "创建时间")
private LocalDateTime acreateTime;
/**
* 更新时间
*/
@TableField(value = "aasy04a050",fill=FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间")
private LocalDateTime aupdateTime;
B.java
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
@TableField(value = "bbsy08a100",fill =FieldFill.INSERT)
private Date bcreateTime;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
@TableField(value = "bbsy08a110",fill = FieldFill.INSERT_UPDATE)
private Date bupdateTime;
クラス A と B の両方に作成時間フィールドと更新時間フィールドがありますが、フィールド名が異なるため、自動入力は失敗するはずです。. . . .
午後中ずっとコードを読んだ後(2時間眠っていました***)、次の方法を思いつき、コードを直接アップロードしました!! !
/**
* @Author ZhaoJianTao
* @Description 根据注解自动填充值
* @CreationDate 2021/3/6
*/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
Class<?> originalClass = metaObject.getOriginalObject().getClass();
Field[] field = originalClass.getDeclaredFields();
for (int i = 1; i < field.length; i++) {
String fieldName=field[i].getName();
String type = field[i].getType().getName();
TableField ann = field[i].getAnnotation(TableField.class);
if(ann!=null && (FieldFill.INSERT_UPDATE.equals(ann.fill()) || FieldFill.INSERT.equals(ann.fill()))){
if("java.util.Date".equals(type)){
this.strictInsertFill(metaObject, fieldName, Date.class, new Date());
}else if("java.time.LocalDateTime".equals(type)){
this.strictInsertFill(metaObject, fieldName, LocalDateTime.class, LocalDateTime.now());
}
}
}
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
Class<?> originalClass = metaObject.getOriginalObject().getClass();
Field[] field = originalClass.getDeclaredFields();
for (int i = 1; i < field.length; i++) {
String fieldName=field[i].getName();
String type = field[i].getType().getName();
TableField ann = field[i].getAnnotation(TableField.class);
if(ann!=null && (FieldFill.INSERT_UPDATE.equals(ann.fill()) || FieldFill.UPDATE.equals(ann.fill()))){
if("java.util.Date".equals(type)){
this.strictUpdateFill(metaObject, fieldName, Date.class, new Date());
}else if("java.time.LocalDateTime".equals(type)){
this.strictUpdateFill(metaObject, fieldName, LocalDateTime.class, LocalDateTime.now());
}
}
}
}
}
コードはまだ最適化が必要かもしれませんが、固定フィールド名に基づいて値を入力するという制限を解決できます. 例では、時間の種類を判断し、その他の拡張も行うことができます.もっと良い方法、教えてください!! !
脚注付きのテキスト。