zoukankan      html  css  js  c++  java
  • mybatis源码解析12---ResultSetHandler解析

    说完了StatementHandler和ParameterHandler,接下来就需要对查询的结果进行处理了,而对于sql结果的处理是由ResultSetHandler处理的,ResultHandler位于mybatis包的

    org.apache.ibatis.executor.resultset下,源码如下:

    1 public interface ResultSetHandler {
    2 
    3   <E> List<E> handleResultSets(Statement stmt) throws SQLException;
    4 
    5   <E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;
    6 
    7   void handleOutputParameters(CallableStatement cs) throws SQLException;
    8 
    9 }

    前面两个方法是处理Statement执行后的结果集,而后面一个方法是处理存储过程执行后的输出参数。本文主要分析处理Statement执行结果的第一个方法,ResultSetHandler默认实现类是

    DefaultResultSetHandler。和StatementHandler、ParameterHandler一样也是通过Configuration进行初始化的,代码如下:

    1   public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
    2       ResultHandler resultHandler, BoundSql boundSql) {
    3     ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);
    4     resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);
    5     return resultSetHandler;
    6   }

    DefaultResultSetHandler处理Statement的执行结果方法代码如下:

     1 @Override
     2   public List<Object> handleResultSets(Statement stmt) throws SQLException {
     3     ErrorContext.instance().activity("handling results").object(mappedStatement.getId());
     4 
     5     final List<Object> multipleResults = new ArrayList<Object>();//定义返回结果的List
     6 
     7     int resultSetCount = 0;//定义结果长度
     8     ResultSetWrapper rsw = getFirstResultSet(stmt);//获取第一个结果集
     9 
    10     //获取结果集合
    11     List<ResultMap> resultMaps = mappedStatement.getResultMaps();
    12     //一般结果集合只有1个
    13     int resultMapCount = resultMaps.size();
    14     //
    15     validateResultMapsCount(rsw, resultMapCount);
    16     while (rsw != null && resultMapCount > resultSetCount) {
    17       //获取第一个结果集合
    18       ResultMap resultMap = resultMaps.get(resultSetCount);
    19       //处理结果映射,将数据存放到list中
    20       handleResultSet(rsw, resultMap, multipleResults, null);
    21       //取下一个结果集合重复操作
    22       rsw = getNextResultSet(stmt);
    23       cleanUpAfterHandlingResultSet();
    24       resultSetCount++;
    25     }
    26 
    27     String[] resultSets = mappedStatement.getResultSets();
    28     if (resultSets != null) {
    29       while (rsw != null && resultSetCount < resultSets.length) {
    30         ResultMapping parentMapping = nextResultMaps.get(resultSets[resultSetCount]);
    31         if (parentMapping != null) {
    32           String nestedResultMapId = parentMapping.getNestedResultMapId();
    33           ResultMap resultMap = configuration.getResultMap(nestedResultMapId);
    34           handleResultSet(rsw, resultMap, null, parentMapping);
    35         }
    36         rsw = getNextResultSet(stmt);
    37         cleanUpAfterHandlingResultSet();
    38         resultSetCount++;
    39       }
    40     }
    41 
    42     return collapseSingleResultList(multipleResults);
    43   }
  • 相关阅读:
    Linux下使用Eclipse 远程调试
    关于Mysql分区和分表
    Mysql点滴
    父窗口与iFrame之间调用方法和元素
    pl/sql developer安装使用即时客户端
    Java的四大基础特性
    Get与Post的小知识
    ibatis 中 $与#的区别
    Eclipse安装配置Maven
    Git学习
  • 原文地址:https://www.cnblogs.com/jackion5/p/10600500.html
Copyright © 2011-2022 走看看