Mybatis 源码解析 07 - 关键组件 ResultSetHandler

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对应字段(属性)的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值