当我们系统数据库表的设计中包含一些固定字段,每张表都有时,可以继承Mybatis-Plus的MetaObjectHandler方法,通过实现insertFill和updateFill方法解决。当然也可以通过添加字段注解的方式动态的添加固定字段值,其本质最终也是实现这两个方法。
/**
* 元对象字段填充控制器抽象类,实现公共字段自动写入
*
*/
public interface MetaObjectHandler {
/** @deprecated */
String MP_OPTLOCK_ET_ORIGINAL = "MP_OPTLOCK_ET_ORIGINAL";
/**
* 插入元对象字段填充(用于插入时公共字段的填充)
*
*/
void insertFill(MetaObject metaObject);
/**
* 更新元对象字段填充(用于更新时公共字段的填充)
*
*/
void updateFill(MetaObject metaObject);
/**
* 填充字段的值
*
*/
default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
if (Objects.nonNull(fieldVal)) {
if (metaObject.hasSetter(fieldName) && metaObject.hasGetter(fieldName)) {
metaObject.setValue(fieldName, fieldVal);
} else if (metaObject.hasGetter("et")) {
Object et = metaObject.getValue("et");
if (et != null) {
MetaObject etMeta = SystemMetaObject.forObject(et);
if (etMeta.hasSetter(fieldName)) {
etMeta.setValue(fieldName, fieldVal);
}
}
}
}
return this;
}
default MetaObjectHandler setInsertFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
return this.setFieldValByName(fieldName, fieldVal, metaObject, FieldFill.INSERT);
}
default MetaObjectHandler setUpdateFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
return this.setFieldValByName(fieldName, fieldVal, metaObject, FieldFill.UPDATE);
}
default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject, FieldFill fieldFill) {
if (Objects.nonNull(fieldVal)) {
if (metaObject.hasSetter(fieldName) && metaObject.hasGetter(fieldName) && this.isFill(fieldName, fieldVal, metaObject, fieldFill)) {
metaObject.setValue(fieldName, fieldVal);
} else if (metaObject.hasGetter("et")) {
Object et = metaObject.getValue("et");
if (et != null) {
MetaObject etMeta = SystemMetaObject.forObject(et);
if (etMeta.hasSetter(fieldName) && this.isFill(fieldName, fieldVal, etMeta, fieldFill)) {
etMeta.setValue(fieldName, fieldVal);
}
}
}
}
return this;
}
default Object getFieldValByName(String fieldName, MetaObject metaObject) {
if (metaObject.hasGetter(fieldName)) {
return metaObject.getValue(fieldName);
} else {
return metaObject.hasGetter("et." + fieldName) ? metaObject.getValue("et." + fieldName) : null;
}
}
default boolean isFill(String fieldName, Object fieldVal, MetaObject metaObject, FieldFill fieldFill) {
TableInfo tableInfo = metaObject.hasGetter("MP_OPTLOCK_ET_ORIGINAL") ? TableInfoHelper.getTableInfo(metaObject.getValue("MP_OPTLOCK_ET_ORIGINAL").getClass()) : TableInfoHelper.getTableInfo(metaObject.getOriginalObject().getClass());
if (Objects.nonNull(tableInfo)) {
Optional<TableFieldInfo> first = tableInfo.getFieldList().stream().filter((e) -> {
return e.getProperty().equals(fieldName) && e.getPropertyType().isAssignableFrom(fieldVal.getClass());
}).findFirst();
if (first.isPresent()) {
FieldFill fill = ((TableFieldInfo)first.get()).getFieldFill();
return fill.equals(fieldFill) || FieldFill.INSERT_UPDATE.equals(fill);
}
}
return false;
}
default boolean openInsertFill() {
return true;
}
default boolean openUpdateFill() {
return true;
}
}