mybatis四大接口之 ResultSetHandler


1. 繼承結構

  

2. ResultSetHandler

public interface ResultSetHandler {
    // 將Statement執行后產生的結果集(可能有多個結果集)映射為結果列表
  <E> List<E> handleResultSets(Statement stmt) throws SQLException;

  <E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;
    // 處理存儲過程執行后的輸出參數
  void handleOutputParameters(CallableStatement cs) throws SQLException;

}

3. DefaultResultSetHandler

  ResultSetHandler的具體實現類是DefaultResultSetHandler,其實現的步驟就是將Statement執行后的結果集,按照Mapper文件中配置的ResultType或ResultMap來封裝成對應的對象,最后將封裝的對象返回 。

  以最常用的 handleResultSets 為例進行簡單的分析:

  @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();
    // 判斷 ResultMap 是否為空,空則拋異常
    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);
  }

PS:學累了,mybatis就先到這吧。

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM