mybatis四大神器之ResultSetHandler

2020-08-05  本文已影响0人  ajajaj

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

ResultSetHandler简介

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

上一篇 下一篇

猜你喜欢

热点阅读