mybatis3 源码深度解析-认识ResultSetHandler结果集处理器

大纲:

  • 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++;
    }

    // 处理
   
验证码:

相关文章

推荐文章