• MyBatis 学习记录6 TypeHandler


    主题

      因为对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,所以就记录并学习一下TypeHandler.

    使用场景

    如上图所示,观察下接口方法就能明白.TypeHandler主要用于JDBC数据与Java对象数据之间转化,比如更新数据库的时候可以设置java对象里的字段怎么映射到JDBC数据库支持的类型.或者查询数据的时候,返回的JDBC的数据怎么转化成Java对象中的属性.

    这篇文章主要以一个select查询为例,学习下TypeHandler都被应用在了哪些阶段? 怎么被使用的.

    初始化阶段

    正如之前文章分享的那样.MyBatis在初始化build SqlSessionFactory的时候会解析一大堆东西,生成Configuration.内置的TypeHandler在这个阶段被初始化.

    如上图, new Configuration的时候会初始化TypeHandlerRegistry.

    而这个Registry的构造方法就是注册各种内置的TypeHandler的地方.

    如上图所示, register方法用于向TypeHandlerRegistry的成员域(Map)里注册TypeHandler.

    register方法被重载了N多次.但是可以归纳为大致几种作用.

    在此之前先介绍下TypeHandlerRegistry的几个成员域.因为register方法与他们密不可分.

    JDBC_TYPE_HANDLER_MAP key为JDBC类型 Value是TypeHandler
    TYPE_HANDLER_MAP    key是Java的Class类型,比如String.class, Value是1个Map,Key是JDBC类型,Value是TypeHandler. Value的key可以为null
    ALL_TYPE_HANDLERS_MAP key是TypeHandler的Class类型, Value是TypeHandler
    register有很多重载的方法.小结一下的话大约有2个分支:
    register(Type javaType, JdbcType jdbcType, TypeHandler<?> handler)
    这个方法就是
    1. 为1个Java类型添加对应的JDBC类型与handler. 主要是往TYPE_HANDLER_MAP里添加数据
    2. 记录有哪些TypeHandler.即往ALL_TYPE_HANDLERS_MAP中里面添加数据.
    它的一个变体是register(Type javaType, TypeHandler<? extends T> typeHandler)这个方法. 没有传JdbcType. 在这种情况下会扫描Handler上面的MappedJdbcTypes注解,找到这个handler对应的JdbcType.

    当然也有类似public <T> void register(TypeHandler<T> typeHandler)这种变体.会扫描Handler上面的MappedTypes注解,找到对应的javaType.

    register(JdbcType jdbcType, TypeHandler<?> handler) 这个分支是不传Java Type变量的.
    这个分支就比较简单了.往JDBC_TYPE_HANDLER_MAP中加入数据
     
     
    除了内置的TypeHandler自己也可以设置自定义的TypeHandler

    在初始化的解析conf的时候会解析

    这个代码比较简单,直接看就能明白.唯一要注意的是是先初始化自带的typeHandler.再加载自定义的typeHandler.所以自己定义的可能会覆盖mybatis内置的.

     
    至此,TypeHandlerRegistry就已经完成了注册handler的任务了.
     
     

    解析Mapper阶段

    其实这个也算是初始化阶段...在解析完自定义的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对象的时候也会掉相应的方法

     
     
     
  • 相关阅读:
    (转)Epoll模型详解
    (转)彻底学会使用epoll(一)——ET模式实现分析
    (转)Linux内核 TCP/IP、Socket参数调优
    Nodejs RESTFul架构实践之api篇(转)
    创业笔记-Node.js入门之阻塞与非阻塞
    创业笔记-Node.js入门之基于事件驱动的回调
    创业笔记-Node.js入门之一个完整的基于Node.js的web应用
    创业笔记-Node.js入门之JavaScript与Node.js
    在CentOS6.5下配置安装LVS
    zend studio 添加xdebug调试php代码
  • 原文地址:https://www.cnblogs.com/abcwt112/p/9800129.html
Copyright © 2020-2023  润新知