栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

阅读笔记-Mybatis查询结果处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

阅读笔记-Mybatis查询结果处理

1、结果处理入口SimpleExecutor 1.1、SimpleExecutor#doQuery
public  List doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
  Statement stmt = null;
  try {
    Configuration configuration = ms.getConfiguration();
    //创建StatementHandler,
    StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
    //预编译包括SQL的编译、参数的设置
    stmt = prepareStatement(handler, ms.getStatementLog());
    //执行查询以及结果集的封装
    return handler.query(stmt, resultHandler);
  } finally {
    //关闭
    closeStatement(stmt);
  }
}
1.2、PreparedStatementHandler#query
  @Override
  public  List query(Statement statement, ResultHandler resultHandler) throws SQLException {
    PreparedStatement ps = (PreparedStatement) statement;
    //执行SQL
    ps.execute();
    //结果集处理,见2、结果集处理DefaultResultSetHandler
    return resultSetHandler. handleResultSets(ps);
  }
2、结果集处理DefaultResultSetHandler 2.1、DefaultResultSetHandler#handleResultSets
public List handleResultSets(Statement stmt) throws SQLException {
    ErrorContext.instance().activity("handling results").object(mappedStatement.getId());

    final List multipleResults = new ArrayList();

    int resultSetCount = 0;
    ResultSetWrapper rsw = getFirstResultSet(stmt);

    List resultMaps = mappedStatement.getResultMaps();
    int resultMapCount = resultMaps.size();
    validateResultMapsCount(rsw, resultMapCount);
    while (rsw != null && resultMapCount > resultSetCount) {
      ResultMap resultMap = resultMaps.get(resultSetCount);
      //处理查询结果,此处会将结果封装到指定的对象中,并且保存到了multipleResults
      handleResultSet(rsw, resultMap, multipleResults, null);
      rsw = getNextResultSet(stmt);
      cleanUpAfterHandlingResultSet();
      resultSetCount++;
    }

    //....

  	//返回结果集
    return collapseSingleResultList(multipleResults);
  }
 
2.2、DefaultResultSetHandler#handleRowValuesForSimpleResultMap 
private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler resultHandler, RowBounds rowBounds, ResultMapping parentMapping)
  throws SQLException {
  DefaultResultContext resultContext = new DefaultResultContext();
  //处理跳过某些无效的行
  skipRows(rsw.getResultSet(), rowBounds);
  while (shouldProcessMoreRows(resultContext, rowBounds) && rsw.getResultSet().next()) {
    ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(rsw.getResultSet(), resultMap, null);
    //解析查询结果,见2.3、DefaultResultSetHandler#getRowValue
    Object rowValue = getRowValue(rsw, discriminatedResultMap);
    //将结果保存到resultHandler,见2.5
    storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
  }
}
 
2.3、DefaultResultSetHandler#getRowValue 

方法中会触发createResultObject进行结果对象的创建。如果是自定义类型的对象(结果对象类型没有在typeHandlerRegistry中注册过。)则会创建一个空的结果对象。如果结果对象在typeHandlerRegistry中注册过则会调用相应的handler进行结果的处理。

private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException {
  final ResultLoaderMap lazyLoader = new ResultLoaderMap();
  //结果对象的创建,见2.3.1、DefaultResultSetHandler#createResultObject
  Object rowValue = createResultObject(rsw, resultMap, lazyLoader, null);
  //如果是通过typehandler创建的则rowvale即为结果对象了,会直接被返回,否则rowvalue为查询结果,需要进入此分支进行最终的结果对象封装
  if (rowValue != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
    //将结果对象rowValue包装到metaObject中,在下面的代码中进行属性赋值是都是使用metaObject进行统一的赋值操作
    final metaObject metaObject = configuration.newmetaObject(rowValue);
    boolean foundValues = this.useConstructorMappings;
    if (shouldApplyAutomaticMappings(resultMap, false)) {
      foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;
    }
    //进行属性的赋值,见2.4、属性赋值DefaultResultSetHandler#applyPropertyMappings
    foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, null) || foundValues;
    foundValues = lazyLoader.size() > 0 || foundValues;
    rowValue = (foundValues || configuration.isReturnInstanceForEmptyRow()) ? rowValue : null;
  }
  return rowValue;
}
2.3.1、DefaultResultSetHandler#createResultObject
 private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, String columnPrefix) throws SQLException {
    this.useConstructorMappings = false; // reset previous mapping result
    final List> constructorArgTypes = new ArrayList>();
    final List constructorArgs = new ArrayList();
    Object resultObject = createResultObject(rsw, resultMap, constructorArgTypes, constructorArgs, columnPrefix);
    if (resultObject != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
      final List propertyMappings = resultMap.getPropertyResultMappings();
      for (ResultMapping propertyMapping : propertyMappings) {
        // issue gcode #109 && issue #149
        if (propertyMapping.getNestedQueryId() != null && propertyMapping.isLazy()) {
          resultObject = configuration.getProxyFactory().createProxy(resultObject, lazyLoader, configuration, objectFactory, constructorArgTypes, constructorArgs);
          break;
        }
      }
    }
    this.useConstructorMappings = (resultObject != null && !constructorArgTypes.isEmpty()); // set current mapping result
    return resultObject;
  }

  private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, List> constructorArgTypes, List constructorArgs, String columnPrefix)
      throws SQLException {
    final Class resultType = resultMap.getType();
    final metaClass metaType = metaClass.forClass(resultType, reflectorFactory);
    final List constructorMappings = resultMap.getConstructorResultMappings();
    //判断结果类型是否已经被注册过,有则进入否则继续往下判断
    if (hasTypeHandlerForResultObject(rsw, resultType)) {
      //调用已经注册过的handler进行结果的处理。见2.3.2、DefaultResultSetHandler#createPrimitiveResultObject
      return createPrimitiveResultObject(rsw, resultMap, columnPrefix);
      //有参构造方法创建
    } else if (!constructorMappings.isEmpty()) {
      return createParameterizedResultObject(rsw, resultType, constructorMappings, constructorArgTypes, constructorArgs, columnPrefix);
     //是一个接口或则有默认的构造器则进入此分支,默认一般是进入到这里
    } else if (resultType.isInterface() || metaType.hasDefaultConstructor()) {
      return objectFactory.create(resultType);
    } else if (shouldApplyAutomaticMappings(resultMap, false)) {
      return createByConstructorSignature(rsw, resultType, constructorArgTypes, constructorArgs, columnPrefix);
    }
    throw new ExecutorException("Do not know how to create an instance of " + resultType);
  }
 
2.3.2、DefaultResultSetHandler#createPrimitiveResultObject 
private Object createPrimitiveResultObject(ResultSetWrapper rsw, ResultMap resultMap, String columnPrefix) throws SQLException {
    final Class resultType = resultMap.getType();
    final String columnName;
    if (!resultMap.getResultMappings().isEmpty()) {
      final List resultMappingList = resultMap.getResultMappings();
      final ResultMapping mapping = resultMappingList.get(0);
      columnName = prependPrefix(mapping.getColumn(), columnPrefix);
    } else {
      columnName = rsw.getColumnNames().get(0);
    }
  	//此处会根据结果对象的类型获取对应的typeHandler
    final TypeHandler typeHandler = rsw.getTypeHandler(resultType, columnName);
  	//使用typehandler进行结果处理
    return typeHandler.getResult(rsw.getResultSet(), columnName);
  }
2.4、属性赋值DefaultResultSetHandler#applyPropertyMappings
private boolean applyPropertyMappings(ResultSetWrapper rsw, ResultMap resultMap, metaObject metaObject, ResultLoaderMap lazyLoader, String columnPrefix)
      throws SQLException {
    final List mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix);
    boolean foundValues = false;
    final List propertyMappings = resultMap.getPropertyResultMappings();
    for (ResultMapping propertyMapping : propertyMappings) {
      String column = prependPrefix(propertyMapping.getColumn(), columnPrefix);
      if (propertyMapping.getNestedResultMapId() != null) {
        // the user added a column attribute to a nested result map, ignore it
        column = null;
      }
      if (propertyMapping.isCompositeResult()
          || (column != null && mappedColumnNames.contains(column.toUpperCase(Locale.ENGLISH)))
          || propertyMapping.getResultSet() != null) {
        Object value = getPropertyMappingValue(rsw.getResultSet(), metaObject, propertyMapping, lazyLoader, columnPrefix);
        // issue #541 make property optional
        final String property = propertyMapping.getProperty();
        if (property == null) {
          continue;
        } else if (value == DEFERED) {
          foundValues = true;
          continue;
        }
        if (value != null) {
          foundValues = true;
        }
        if (value != null || (configuration.isCallSettersOnNulls() && !metaObject.getSetterType(property).isPrimitive())) {
          // gcode issue #377, call setter on nulls (value is not 'found')
          //进行赋值
          metaObject.setValue(property, value);
        }
      }
    }
    return foundValues;
  }
2.5、DefaultResultSetHandler#storeObject
private void storeObject(ResultHandler resultHandler, DefaultResultContext resultContext, Object rowValue, ResultMapping parentMapping, ResultSet rs) throws SQLException {    if (parentMapping != null) {      linkToParents(rs, parentMapping, rowValue);    } else {      callResultHandler(resultHandler, resultContext, rowValue);    }  }  @SuppressWarnings("unchecked" )  private void callResultHandler(ResultHandler resultHandler, DefaultResultContext resultContext, Object rowValue) {    resultContext.nextResultObject(rowValue);    ((ResultHandler) resultHandler).handleResult(resultContext);  }


转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号