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   }
  • 相关阅读:
    老司机心得之时间管理"入坑"
    shell的字符串和数字的转化(数字自动做字符串处理,变量名做字符串输出用单引号)
    shell的date命令:使用方法,以及小时、分钟的计算
    一篇详细的linux中shell语言的字符串处理
    linux的string操作(字符串截取,长度计算)
    linux下数学运算器:expr命令(shell中完成数学运算)
    shell脚本格式的几点注意:格式严格,空格不能随便出现(一写就记不住)
    vim的颜色修改,高亮设置。
    pyhton exit
    python判断类型:想知道一个对象(实例或者变量)是什么类型,什么结构的
  • 原文地址:https://www.cnblogs.com/jackion5/p/10600500.html
Copyright © 2011-2022 走看看