mybatis结果封装源码解读

1.场景说明

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

2.源码调试示例代码

 <!--查询资讯信息-->
<select id="findNews" resultType="com.it.txm.demo.controller.News">
    select id,title from find_news
</select>

3.结果集封装源码

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

  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();
	
	// 校验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<UnMappedColumnAutoMapping> 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;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
介绍: 1、App封装 实现App封装,混合开发App,100多JS接口功能交互。 2、制作小程序 通过接口网站封装成小程序。 安装环境变色龙app封装系统源码 环境:PHP 5.6 MySQL 存储:七牛存储 源码介绍: 这款变色龙app封装系统源码更适合小企业主和个人用户,打包过程简单方便快捷。附件为变色龙app封装系统源码官方正版下载,无毒无后门,原汁原味。 源码功能介绍: 1、App封装 实现App封装,混合开发App,100多JS接口功能交互。 2、制作小程序 通过接口网站封装成小程序。 安装环境变色龙app封装系统源码 环境:PHP 5.6 MySQL 存储:七牛存储 环境要求: CPU:1核,内存:2G,硬盘:10G,1M带宽 不能用空间,有要修改php环境的要求。 版本区别: 1、免费版本 封装App 微信小程序 2、授权版本 封装App 微信小程序 分发App 在线签名 超级签名 企业签名 苹果免签App 详细安装配置教程: 1、导入sql里数据表 ,文件 /sql/install.sql 2、修改:public/cmpl_config.php 内网址更换 ’master_site’=>’www.zywxfx.com’,//官网地址 ’source_site’=>’www.bslyun.com’,//存放用户配置资源的地址 ’db_site’=>’www.bslyun.com’,//数据库变动专用地址 ’https_site’=>’www.zywxfx.com’,//https官网地址 更换为自已的网址 db_config.php 修改数据库联接地址 3、网站启动https。 4、必须同步商品 后台商品内点同步。 5、如服务器是nginx的,配置nginx伪静态文件.txt IIS导入.htaccess配置文件。 6、php环境要求 system、popen、exec 函数开放 7、七牛的配置 对象存储->您的存储空间->图片样式->新建图片样式 选择手动编辑 编辑处理接口请填写:$0.apk 图片处理样式名称:atail 保存样 8、安装php的扩展imagick 9、增加php上传字节限制 max_input_vars = 2000 如果是windows服务器,请配置以下操作。不是windows服务器对以下操作忽略。 1、iis7以上,下载页404问题 https://www.cnblogs.com/imust2008/p/6829927.html 2、ipa包无法下载 打开Internet 服务管理器Internet 服务管理器–>网站属性–>HTTP头(MIME映射)–>新建 添加下列内容类型(MIME) 关联扩展名 plist application/xml 顺便加一个 ipa application/vnd.iphone 3、无法更新商品 文件在/system/common.php 注:解压密码打开压缩文件可以看到

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卖柴火的小伙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值