MyBatis3源码解析(5)查询结果处理

本文深入探讨MyBatis3在获取查询结果后,如何将SQL查询结果映射到接口返回的Java对象。从结果处理入口出发,详细阐述SQL结果处理逻辑,包括循环遍历ResultSet,类型转换等关键步骤。
摘要由CSDN通过智能技术生成

简介

上篇中解析了MyBatis3中参数是如何传递处理的,本篇接着看看在获取到查询结果后,MyBatis3是如何将SQL查询结果与我们接口函数定义的返回结果对应的

源码

获取结果后处理的入口

在:MyBatis3源码解析(3)查询语句执行中,我们大致知道了查询结果处理的想代码位置,如下:

public class PreparedStatementHandler extends BaseStatementHandler {
   
  @Override
  public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {
   
    PreparedStatement ps = (PreparedStatement) statement;
    ps.execute();
    // 前面的语句已经执行,处理结果返回
    return resultSetHandler.handleResultSets(ps);
  }
}

SQL结果处理

下面是具体的处理逻辑,先获取结果集和Mapper中定义的返回结果的相关信息,然后对应进行处理

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;
    // 获取结果集,并用自定义包装起来
    ResultSetWrapper rsw = getFirstResultSet(stmt);

    // 获取ResultMap对象,一般只有一个,其实就是需要返回的类信息之类的
    List<ResultMap> resultMaps = mappedStatement.getResultMaps();
    int resultMapCount = resultMaps.size();
    validateResultMapsCount(rsw, resultMapCount);
    while (rsw != null && resultMapCount > resultSetCount) {
   
      ResultMap resultMap = resultMaps.get(resultSetCount);
      // 在这里会循环获取SQL结果集并进行转换
      handleResultSet(rsw, resultMap, multipleResults, null);
      rsw = getNextResultSet(stmt);
      cleanUpAfterHandlingResultSet();
      resultSetCount++;
    }

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值