栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis结果封装源码解读

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis结果封装源码解读

1.场景说明

    本文只讲述sql执行之后结果封装,大概流程:根据配置文件中的结果类型(resultType)利用反射创建查询结果对象;然后将statement查询结果给创建的空对象进行赋值.至此完成数据结果集封装.

2.源码调试示例代码
 

    select id,title from find_news

3.结果集封装源码

    结果集处理核心方法:DefaultResultSetHandler.java中handleResultSets

  public List handleResultSets(Statement stmt) throws SQLException {
    ErrorContext.instance().activity("handling results").object(mappedStatement.getId());

	// 存放查询结果的集合 
    final List multipleResults = new ArrayList<>();
	
    int resultSetCount = 0;
    // 获取结果集处理包装类
    ResultSetWrapper rsw = getFirstResultSet(stmt);
	
	// resultMap封装结果集合
    List resultMaps = mappedStatement.getResultMaps();
    int resultMapCount = resultMaps.size();
	
	// 校验sql中是否有resultMap结果集,如果没有则异常:A query was run and no Result Maps were found for the Mapped Statement 
    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);
  }
 

    表字段与类属性进行自动数据映射封装(DefaultResultSetHandler.java中applyAutomaticMappings)

  private boolean applyAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, metaObject metaObject, String columnPrefix) throws SQLException {
  // 获取字段与属性映射UnMappedColumnAutoMapping对象的集合;
    List autoMapping = createAutomaticMappings(rsw, resultMap, metaObject, columnPrefix);
    boolean foundValues = false;
    if (!autoMapping.isEmpty()) {
      for (UnMappedColumnAutoMapping mapping : autoMapping) {
      // 获取查询数据值
        final Object value = mapping.typeHandler.getResult(rsw.getResultSet(), mapping.column);
        if (value != null) {
          foundValues = true;
        }
        if (value != null || (configuration.isCallSettersOnNulls() && !mapping.primitive)) {
		// 利用反射将字段对应的数据赋值给属性,完成对象属性赋值操作;metaObject源对象中的originalObject即为根据resultTpe类型利用反射创建的对象.然后根据查询结果给对象各属性进行赋值;
          metaObject.setValue(mapping.property, value);
        }
      }
    }
    return foundValues;
  }
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号