美文网首页
mybatis四大神器之ResultSetHandler

mybatis四大神器之ResultSetHandler

作者: ajajaj | 来源:发表于2020-08-05 13:02 被阅读0次

前面的文章介绍了Mybatis四大神器中的三个Executor、StatementHandler、ParameterHandler,本文介绍最后一个神器ResultSetHandler

ResultSetHandler简介

  • 处理Statement执行后产生的结果集,生成结果列表

  • 处理存储过程执行后的输出参数

public interface ResultSetHandler {
    <E> List<E> handleResultSets(Statement var1) throws SQLException;

    <E> Cursor<E> handleCursorResultSets(Statement var1) throws SQLException;

    void handleOutputParameters(CallableStatement var1) throws SQLException;
}

ResultSetHandler继承体系

只有一个实现类DefaultResultSetHandler

image

DefaultResultSetHandler 具体的操作就是将Statement执行后的结果集,按照Mapper文件中配置的ResultType或ResultMap来封装成对应的对象,最后将封装的对象返回

@Override
  public List<Object> handleResultSets(Statement stmt) throws SQLException {
    ErrorContext.instance().activity("handling results").object(mappedStatement.getId());

    final List<Object> multipleResults = new ArrayList<Object>();

    int resultSetCount = 0;
    // 第一个结果集
    ResultSetWrapper rsw = getFirstResultSet(stmt);
    // 获取结果映射resultMap 
    List<ResultMap> resultMaps = mappedStatement.getResultMaps();
    int resultMapCount = resultMaps.size();
    // 判断结果映射的数量
    validateResultMapsCount(rsw, resultMapCount);
    // 处理第一个结果集
    while (rsw != null && resultMapCount > resultSetCount) {
      ResultMap resultMap = resultMaps.get(resultSetCount);
      // 将结果集映射为对应的 ResultMap 对象
      handleResultSet(rsw, resultMap, multipleResults, null);
      rsw = getNextResultSet(stmt);
      cleanUpAfterHandlingResultSet();
      resultSetCount++;
    }

    String[] resultSets = mappedStatement.getResultSets();
    if (resultSets != null) {
        // 多个结果集
      while (rsw != null && resultSetCount < resultSets.length) {
       ResultMapping parentMapping = nextResultMaps.get(resultSets[resultSetCount]);
        if (parentMapping != null) {
          String nestedResultMapId = parentMapping.getNestedResultMapId();
          ResultMap resultMap = configuration.getResultMap(nestedResultMapId);
          handleResultSet(rsw, resultMap, null, parentMapping);
        }
        rsw = getNextResultSet(stmt);
        cleanUpAfterHandlingResultSet();
        resultSetCount++;
      }
    }

    return collapseSingleResultList(multipleResults);
  }

原文地址

http://cbaj.gitee.io/blog/2020/07/21/mybatis%E5%9B%9B%E5%A4%A7%E7%A5%9E%E5%99%A8%E4%B9%8BResultSetHandler/#more

相关文章

网友评论

      本文标题:mybatis四大神器之ResultSetHandler

      本文链接:https://www.haomeiwen.com/subject/clhlrktx.html