上一次分析了mapper接口动态代理调用的处理过程,在查询结果后,然后转换的java所对应的类型,这篇文章将对这个类型转换处理详细介绍,在Configuration中TypeHandlerRegistry这个类,是用来注册

可以看到TypeHandlerRegistry注册java中各种类型的类型处理器。 默认handler处理器的是Confguration中创建的faultResultHandler结果处理器, 这个是PreparedStatementHandler类中,执行query方法后,调用的ResultHandler调用handleResultSets方法,返回处理结果。 首先使从MapperStatement中查找对应的ResultMap对象,这里ResultMaps只有一个对象,就是我们在Mapper接口方法返回值类型,这里有点不是很明白,它这里设计有个有个返回值的,但是java里面不是只有一个返回值吗,回头再思考下,先看下面最重要的处理结果的过程,首先遍历ResultMap列表,接着调用handlerResultSet接口,处理单个结果集,然后获取下一个结果集,清除嵌套的对象的缓存。 这里主要是处理单个结果集,没有父节点的映射,resultHandler为null,则调用的是DefaultResultHandler,接着调用handlerRowValue,最后关闭当前结果集。接下来重要看一下处理每一行代码的。 这里分为是否没有嵌套的对象,如果没有,则处理没一行的值,下面就简单看一下handlerRowValueForSimpleResultMap这个方法. 这个方法主要是的获取当前行的每一行的值,并转换成对象,这个过程主要是在getRowValue这个方法中完成的,然后调用storeObject方法。存储转换后的结果存储DefaultResultHandler中去。 这里首先代用createResultObject创建一个空的对象,然后调用Configuration中的newMetaObject方法创建一个元对象。然后调用applyAutomaticMappings,就是自动映射设置值到反射生成的对象中去,然后在设置有属性映射的 属性,处理完返回。 看到这里利用反射机制创建一个空的对象,然后接处理设置值到对象的每一个属性上设值。 这里ObejectFactory创建的对象,反射完成创建返回的bean对象。 这里是先粗粒自动映射的列的值, 然后在执行有映射的列的值。最后返回。 这段代码是找到自动映射的属性,先从缓存中去,这里看到的mapperKey的组成resultMap+":"+columnPrefix,resultMapId进程过调试发现是类全名.方法名.-inline, 这个inline默认加的后缀,然后处理每一列的转换。

mybatis源码解析(五) --- typehandler注册和处理的查询结果对象的类型转换相关推荐

  1. MyBatis3源码解析(7)TypeHandler注册与获取

    简介 在上篇文章中,我们介绍了TypeHandler的简单使用和解析了TypeHandler的处理核心,这篇文章中我们接着看到TypeHandler是如注册和获取使用的 源码解析 TypeHandle ...

  2. Mybatis源码解析(一):环境搭建

    Mybatis源码系列文章 手写源码(了解源码整体流程及重要组件) Mybatis源码解析(一):环境搭建 Mybatis源码解析(二):全局配置文件的解析 Mybatis源码解析(三):映射配置文件 ...

  3. 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 http://www.iocoder.cn/Eureka/instance-registry-evict/ ...

  4. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  5. mybatis源码解析(一)

    Mybatis 源码解析 (一) 一. ORM框架的作用 实际开发系统时,我们可通过JDBC完成多种数据库操作.这里以传统JDBC编程过程中的查询操作为例进行说明,其主要步骤如下: (1)注册数据库驱 ...

  6. mybatis源码阅读(五) ---执行器Executor

    转载自  mybatis源码阅读(五) ---执行器Executor 1. Executor接口设计与类结构图 public interface Executor {ResultHandler NO_ ...

  7. Mybatis源码解析《二》

    导语 在前一篇文章Mybatis源码解析<一>中,已经简单了捋了一下mybatis核心文件和mapper配置文件的一个基本的解析流程,这是理解mybatis的基本,和spring中的配置文 ...

  8. (Nacos源码解析五)Nacos服务事件变动源码解析

    Nacos源码解析系列目录 Nacos 源码编译运行 (Nacos源码解析一)Nacos 注册实例源码解析 (Nacos源码解析二)Nacos 服务发现源码解析 (Nacos源码解析三)Nacos 心 ...

  9. 对标阿里P8的MyBatis源码解析文档,面试/涨薪两不误,已献出膝盖

    移动互联网的特点是大数据.高并发,对服务器往往要求分布式.高性能.高灵活等,而传统模式的Java数据库编程框架已经不再适用了. 在这样的背景下,一个Java的持久框架MyBatis走入了我们的世界,它 ...

最新文章

  1. 交通安全与智能控制专业学计算机吗,交通安全与智能控制专业就业方向及就业前景分析...
  2. 一个html的文件当中读取另一个html文件
  3. css毛玻璃效果白边_css3毛玻璃效果白边问题_html/css_WEB-ITnose
  4. 电脑抓整个路由器的包_网络是电竞游戏体验的命脉 2018年年度电竞路由器功能盘点...
  5. Delphi 与 DirectX 之 DelphiX(94): TDIB.DrawAdditive();
  6. 32f4怎样同时采集两个adc_硬件-TI-ADC
  7. Arduino:光立方的开发与实现
  8. PR转场预设 模仿纸张翻转特效PR视频转场PR预设
  9. 面试自我介绍的模板总结
  10. 前端分页(详细步骤)
  11. 独家 | 零基础入门优化问题
  12. Axure绘制页面框架
  13. 数据类型(数据类型简介、数据类型的分类(简单数据类型,获取变量数据类型,数据类型转换))
  14. 扫描工具-Arachni
  15. Spring声明式事务配置管理方法
  16. win7家庭版怎么升级旗舰版
  17. vue项目中数据更新页面不刷新问题
  18. 找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列最小,也可能没有靶点
  19. 计算机分类汇总前必须进行什么操作,分类汇总前必须先进行什么操作
  20. android 2.3 wifi (二)

热门文章

  1. C++11 并发指南六(atomic 类型详解三 std::atomic (续))
  2. JAVA中整数类型数据溢出问题研究
  3. JAVA 网络编程 Socket 详细说明,实现客户端和服务端相互推送消息
  4. Java:根据字节数截取字符串,但是汉字不能截取半个。
  5. VC中对CString 的读写(ini文件)
  6. 2K/XP/2003 系统登录密码破解
  7. JavaEE实战班第二天
  8. Python基础:常用知识点汇总
  9. 手绘导图版:深入解析机器学习在风控场景中的8大应用
  10. html5怎么圆圈怎么打开,HTML5动感圆圈