在Statement接口在执行完之后,会将结果集交给ResultSetHandler进行映射处理。ResultSetHandler是一个接口主要有三个方法:
//处理结果集,生成对应的对象集合 <E> List<E> handleResultSets(Statement stmt) throws SQLException; <E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException; void handleOutputParameters(CallableStatement cs) throws SQLException;
主要看下第一个方法handleResultSets(Statement stmt)。
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的集合,在一个sql产生对个resultSet,可以在sql节点的resultMap中配置多个<resultMap>节点的id,实现对对个结果集的映射 List<ResultMap> resultMaps = mappedStatement.getResultMaps(); int resultMapCount = resultMaps.size(); 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); }
主要是通过方法handleResultSet完成映射的。
private void handleResultSet(ResultSetWrapper rsw, ResultMap resultMap, List<Object> multipleResults, ResultMapping parentMapping) throws SQLException { try { if (parentMapping != null) { //处理多结果集的嵌套映射 handleRowValues(rsw, resultMap, null, RowBounds.DEFAULT, parentMapping); } else { if (resultHandler == null) { //使用默认的resultSetHandler处理 DefaultResultHandler defaultResultHandler = new DefaultResultHandler(objectFactory); //对resultSet进行映射处理 handleRowValues(rsw, resultMap, defaultResultHandler, rowBounds, null); multipleResults.add(defaultResultHandler.getResultList()); } else { handleRowValues(rsw, resultMap, resultHandler, rowBounds, null); } } } finally { // issue #228 (close resultsets) closeResultSet(rsw.getResultSet()); } }
public void handleRowValues(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException { if (resultMap.hasNestedResultMaps()) { //处理嵌套映射 ensureNoRowBounds(); checkResultHandler(); handleRowValuesForNestedResultMap(rsw, resultMap, resultHandler, rowBounds, parentMapping); } else { //简单映射 handleRowValuesForSimpleResultMap(rsw, resultMap, resultHandler, rowBounds, parentMapping); } }
主要看下handleRowValuesForSimpleResultMap的处理:
private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException { DefaultResultContext<Object> resultContext = new DefaultResultContext<>(); ResultSet resultSet = rsw.getResultSet(); //根据rowBounds的offset跳到指定的记录行 skipRows(resultSet, rowBounds); //检测是否还有要处理的映射 while (shouldProcessMoreRows(resultContext, rowBounds) && !resultSet.isClosed() && resultSet.next()) { //确定使用的resultMap对象 ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(resultSet, resultMap, null); //对记录的行进行映射处理:先创建映射后的结果对象,然后自动映射ResultMap中未明确映射的列,最后映射resultMap明确的映射 Object rowValue = getRowValue(rsw, discriminatedResultMap, null); //保存映射结果 storeObject(resultHandler, resultContext, rowValue, parentMapping, resultSet); } }