大纲:
ResultSetHandler 结果集处理器的作用 ResultSetHandler 接口以及方法介绍 ResultSetHandler 默认实现类DefaultResultSetHandler ResultSetHandler 结果集处理器的作用 ResultSetHandler 结果集处理器,用于 StatementHandler对象执行完操作后,对结果集进行处理
ResultSetHandler 接口以及方法介绍 public interface ResultSetHandler {
/**
* 获取 jdbc Statement对象中的 ResultSet对象,对ResultSet对象进行处理,返回包含结果实体的 List 对象列表
* @return
* @throws SQLException
*/
List handleResultSets(Statement stmt) throws SQLException;
/**
* 将ResultSet对象 包装成 Cursor对象,对Cursor进行遍历时,能够动态的从数据库查询数据,避免一次性将所有数据加载到内存中
* @return
* @throws SQLException
*/
Cursor handleCursorResultSets(Statement stmt) throws SQLException;
/**
* 处理存储过程调用结果
* @param cs
* @throws SQLException
*/
void handleOutputParameters(CallableStatement cs) throws SQLException;
} ResultSetHandler 默认实现类DefaultResultSetHandler ResultSetHandler 只有一个默认实现类DefaultResultSetHandler
public class DefaultResultSetHandler implements ResultSetHandler {
private static final Object DEFERRED = new Object();
private final Executor executor;
private final Configuration configuration;
private final MappedStatement mappedStatement;
private final RowBounds rowBounds;
private final ParameterHandler parameterHandler;
private final ResultHandler<?> resultHandler;
private final BoundSql boundSql;
private final TypeHandlerRegistry typeHandlerRegistry;
private final ObjectFactory objectFactory;
private final ReflectorFactory reflectorFactory;
//
// HANDLE RESULT SETS
//
@Override
public List handleResultSets(Statement stmt) throws SQLException {
ErrorContext.instance().activity("handling results").object(mappedStatement.getId());
final List multipleResults = new ArrayList<>();
int resultSetCount = 0;
// 1 返回jdbc ResultSet的包装形式,主要是将java.sql.ResultSetMetaData做了Facade模式
//便于获取表字段名称,字段对应的 TypeHandler
ResultSetWrapper rsw = getFirstResultSet(stmt);
//2 获取返回结果映射集,如:数据库记录需要转为 class cn.javabus.entity.User
List resultMaps = mappedStatement.getResultMaps();
// 绝大部分情况下一个查询只有一个ResultMap, 除非多结果集查询
int resultMapCount = resultMaps.size();
validateResultMapsCount(rsw, resultMapCount);
// 至少执行一次
while (rsw != null && resultMapCount > resultSetCount) {
ResultMap resultMap = resultMaps.get(resultSetCount);
// 3 根据resultMap的定义将resultet打包到应用端的multipleResults中
handleResultSet(rsw, resultMap, multipleResults, null);
// 循环直到处理完所有的结果集,一般情况下,一个execute只会返回一个结果集,除非语句比如存储过程返回多个resultSet
rsw = getNextResultSet(stmt);
// 清空嵌套结果集
cleanUpAfterHandlingResultSet();
resultSetCount++;
}
// 处理标签的 resultSets 属性(关联或集合),该属性一般情况下不会指定
String[] resultSets = mappedStatement.getResultSets();
if (resultSets != null) {
// 如果一个映射语句的resultSet数量比jdbc resultset多的话,多的部分就是嵌套结果集
while (rsw != null && resultSetCount < resultSets.length) {
// nextResultMaps初始化的时候为空,它是在处理主查询每行记录的时候写进去的,所以此时就可以得到主记录是哪个属性
ResultMapping parentMapping = nextResultMaps.get(resultSets[resultSetCount]);
if (parentMapping != null) {
String nestedResultMapId = parentMapping.getNestedResultMapId();
ResultMap resultMap = configuration.getResultMap(nestedResultMapId);
// 得到子结果集的resultMap之后,就可以进行填充了
handleResultSet(rsw, resultMap, null, parentMapping);
}
rsw = getNextResultSet(stmt);
cleanUpAfterHandlingResultSet();
resultSetCount++;
}
}
//4 对 multipleResults处理,如果只有一个结果集则返回结果集中的元素,否则返回多个结果集
return collapseSingleResultList(multipleResults);
} 上述代码步骤 3 handleResultSet()方法后续补充下:
handleResultSet(){
1 调用 handleRowValues...
}