由于对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,因此就记录并学习一下TypeHandler.java
如上图所示,观察下接口方法就能明白.TypeHandler主要用于JDBC数据与Java对象数据之间转化,好比更新数据库的时候能够设置java对象里的字段怎么映射到JDBC数据库支持的类型.或者查询数据的时候,返回的JDBC的数据怎么转化成Java对象中的属性.mysql
这篇文章主要以一个select查询为例,学习下TypeHandler都被应用在了哪些阶段? 怎么被使用的.sql
正如以前文章分享的那样.MyBatis在初始化build SqlSessionFactory的时候会解析一大堆东西,生成Configuration.内置的TypeHandler在这个阶段被初始化.数据库
如上图, new Configuration的时候会初始化TypeHandlerRegistry.mybatis
而这个Registry的构造方法就是注册各类内置的TypeHandler的地方.app
如上图所示, register方法用于向TypeHandlerRegistry的成员域(Map)里注册TypeHandler.学习
register方法被重载了N屡次.可是能够概括为大体几种做用.ui
在此以前先介绍下TypeHandlerRegistry的几个成员域.由于register方法与他们密不可分.spa
固然也有相似public <T> void register(TypeHandler<T> typeHandler)这种变体.会扫描Handler上面的MappedTypes注解,找到对应的javaType.3d
在初始化的解析conf的时候会解析
这个代码比较简单,直接看就能明白.惟一要注意的是是先初始化自带的typeHandler.再加载自定义的typeHandler.因此本身定义的可能会覆盖mybatis内置的.
其实这个也算是初始化阶段...在解析完自定义的typeHandler以后须要解析Mapper
解析Mapper中有1个很重要的步骤就是解析resultMap.
resultMap里须要指定JavaType与JdbcType之间的映射.
那么若是不指定的时候呢?
由于知道jdbcType和Java类型(property),因此会调用这个方法找到对应的TypeHandler
从上图咱们也能够发现,知道了JavaType会取到jdbcType为key, Handler为Value的Map.而后从Map中根据jdbcType去找对应的handler.若是没有,那就使用null做为key去找.至关于null为key获得的是一种不指定JdbcType的通用handler.
若是尚未就作pickSoleHandler方法,取对应的handler(若是这个JavaType只有惟一一个handler,那就取这个,否则就返回null).如此就肯定了handler是哪一个了.
当作selectByPrimaryKey的时候就会调用对应的方法作JAVA->JDBC的类型转化(java Int -> mysql integer)
一样道理,获得结果集映射到Java对象的时候也会掉相应的方法