ResultSetHandler(结果集处理器)与ParameterHandler一样,流程相对比较简单,可以看一下这个接口的方法:
public interface ResultSetHandler {
// 处理一般结果集
<E> List<E> handleResultSets(Statement stmt) throws SQLException;
// 处理游标相关结果集(Cursor)
<E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;
// 存储过程出参
void handleOutputParameters(CallableStatement cs) throws SQLException;
}
此方法也只有一个实现类:DefaultResultSetHandler
可以看到同ParameterHandler一样,在创建StatementHandler实例调用BaseStatementHandler的构造器时,会创建ResultSetHandler
protected BaseStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
this.resultSetHandler = configuration.newResultSetHandler(executor, mappedStatement, rowBounds, parameterHandler, resultHandler, boundSql);
}
public class Confugiration {
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;
}
}
这里我们主要看一下handleResultSets这个方法的实现:
public class DefaultResultSetHandler implements ResultSetHandler {
@Override
public List<Object> handleResultSets(Statement stmt) throws SQLException {
ErrorContext.instance().activity("handling results").object(mappedStatement.getId());
final List<Object> multipleResults = new ArrayList<>();
int resultSetCount = 0;
// 第一个ResultSet
ResultSetWrapper rsw = getFirstResultSet(stmt);
// ResultMap集合
List<ResultMap> resultMaps = mappedStatement.getResultMaps();
int resultMapCount = resultMaps.size();
// 校检rsw不为空,且resultMapCount>=1
validateResultMapsCount(rsw, resultMapCount);
while (rsw != null && resultMapCount > resultSetCount) {
// 拿到一个ResultMap
ResultMap resultMap = resultMaps.get(resultSetCount);
// 处理结果集, 关闭结果集
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);
}
private List<Object> collapseSingleResultList(List<Object> multipleResults) {
return multipleResults.size() == 1 ? (List<Object>) multipleResults.get(0) : multipleResults;
}
}
根据我们配置的ResultMap可知有resultMap的id,类型,以及字段与表列名称的对应关系,这个复杂的过程主要就是从ResultSet中根据column_name获取值然后根据TypeHandler转换为Entity对应字段(属性)的值。