mybatis源码解析12---ResultSetHandler解析

时间:2025-02-09 13:33:50

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

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

 public interface ResultSetHandler {

   <E> List<E> handleResultSets(Statement stmt) throws SQLException;

   <E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;

   void handleOutputParameters(CallableStatement cs) throws SQLException;

 }

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

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

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

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

 @Override
public List<Object> handleResultSets(Statement stmt) throws SQLException {
ErrorContext.instance().activity("handling results").object(mappedStatement.getId()); final List<Object> multipleResults = new ArrayList<Object>();//定义返回结果的List int resultSetCount = 0;//定义结果长度
ResultSetWrapper rsw = getFirstResultSet(stmt);//获取第一个结果集 //获取结果集合
List<ResultMap> resultMaps = mappedStatement.getResultMaps();
//一般结果集合只有1个
int resultMapCount = resultMaps.size();
//
validateResultMapsCount(rsw, resultMapCount);
while (rsw != null && resultMapCount > resultSetCount) {
//获取第一个结果集合
ResultMap resultMap = resultMaps.get(resultSetCount);
//处理结果映射,将数据存放到list中
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);
}