MybatisPlus源码解析3:元数据处理器-MetaObjectHandler

MybatisPlus源码解析3:元数据处理器-MetaObjectHandler

功能:MetaObjectHandler在insert和update的时候,对参数的属性进行填充,可以对数据库的通用字段(比如:创建人、创建时间、更新人和时间等)进行赋值操作。
原理
MetaObjectHandler对参数的元数据进行处理。创建ParameterHandler -> 创建ParameterHandler -> 对传入的对象进行了参数的填充。

1. 执行流程

BaseStatementHandler#BaseStatementHandler - 创建StatementHandler

protected BaseStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    this.configuration = mappedStatement.getConfiguration();
    this.executor = executor;
    this.mappedStatement = mappedStatement;
    this.rowBounds = rowBounds;

    this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();
    this.objectFactory = configuration.getObjectFactory();

    if (boundSql == null) { // issue #435, get the key before calculating the statement
      generateKeys(parameterObject);
      boundSql = mappedStatement.getBoundSql(parameterObject);
    }

    this.boundSql = boundSql;

    this.parameterHandler = configuration.newParameterHandler(mappedStatement, parameterObject, boundSql);
    this.resultSetHandler = configuration.newResultSetHandler(executor, mappedStatement, rowBounds, parameterHandler, resultHandler, boundSql);
  }

创建ParameterHandler

public class MybatisXMLLanguageDriver extends XMLLanguageDriver {

    @Override
    public MybatisDefaultParameterHandler createParameterHandler(MappedStatement mappedStatement,
                                                                 Object parameterObject, BoundSql boundSql) {
        // TODO 使用 MybatisDefaultParameterHandler 而不是 ParameterHandler
        return new MybatisDefaultParameterHandler(mappedStatement, parameterObject, boundSql);
    }
}
 public MybatisDefaultParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    super(mappedStatement, processParameter(mappedStatement, parameterObject), boundSql);
    this.mappedStatement = mappedStatement;
    this.configuration = mappedStatement.getConfiguration();
    this.typeHandlerRegistry = mappedStatement.getConfiguration().getTypeHandlerRegistry();
    this.parameterObject = parameterObject;
    this.boundSql = boundSql;
}

通过processParameter(mappedStatement, parameterObject)对参数进行增强

protected static Object processParameter(MappedStatement ms, Object parameterObject) {
   /* 只处理插入或更新操作 */
    if (parameterObject != null
        && (SqlCommandType.INSERT == ms.getSqlCommandType() || SqlCommandType.UPDATE == ms.getSqlCommandType())) {
        //检查 parameterObject
        if (ReflectionKit.isPrimitiveOrWrapper(parameterObject.getClass())
            || parameterObject.getClass() == String.class) {
            return parameterObject;
        }
        Collection<Object> parameters = getParameters(parameterObject);
        if (null != parameters) {
            // 感觉这里可以稍微优化一下,理论上都是同一个.
            parameters.forEach(obj -> process(ms, obj));
        } else {
            process(ms, parameterObject);
        }
    }
    return parameterObject;
}

如果参数不为空,并且是Insert或者Update,那么就对参数进行处理

private static void process(MappedStatement ms, Object parameterObject) {
    if (parameterObject != null) {
        TableInfo tableInfo = null;
        Object entity = parameterObject;
        if (parameterObject instanceof Map) {
            Map<?, ?> map = (Map<?, ?>) parameterObject;
            if (map.containsKey(Constants.ENTITY)) {
                Object et = map.get(Constants.ENTITY);
                if (et != null) {
                    entity = et;
                    tableInfo = TableInfoHelper.getTableInfo(entity.getClass());
                }
            }
        } else {
            tableInfo = TableInfoHelper.getTableInfo(parameterObject.getClass());
        }
        if (tableInfo != null) {
            //到这里就应该转换到实体参数对象了,因为填充和ID处理都是争对实体对象处理的,不用传递原参数对象下去.
            MetaObject metaObject = ms.getConfiguration().newMetaObject(entity);
            if (SqlCommandType.INSERT == ms.getSqlCommandType()) {
                populateKeys(tableInfo, metaObject, entity);
                insertFill(metaObject, tableInfo);
            } else {
                updateFill(metaObject, tableInfo);
            }
        }
    }
}
  1. 获取到实体类entity 对象
  2. 通过实体对象获取表的信息tableInfo
  3. 具体调用insertFill和updateFill进行属性填充
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值