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

上一次分析了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默认加的后缀,然后处理每一列的转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值