Mybatis-Plus固定字段填充

156 阅读1分钟

当我们系统数据库表的设计中包含一些固定字段,每张表都有时,可以继承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;
    }
}