说完了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 }