美文网首页
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