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   }
原文地址:https://www.cnblogs.com/jackion5/p/10600500.html