Mybatis实战之TypeHandler高级进阶

Mybatis实战之TypeHandler高级进阶

上篇文章分享了在项目实战中自定义Mybatis的TypeHandler来处理枚举类型。文章结尾也指出了美中不足之处,那就是每次都须要指定咱们自定义的枚举TypeHandler。 随着项目枚举类型的增多,每次都要写一遍这个会使人很反感。那么,本次咱们就来解决这一痛点。
java

思路分析

  1. 上篇文章讲到, mybatis有默认的处理枚举类型的TypeHandler,所以,咱们要将咱们自定义的枚举TypeHandler注册进入Mybatis。sql

  2. 注册完咱们自定义的TypeHandler后,还得告诉Mybatis只要一遇到咱们指定的枚举类型(上篇的DisplayedEnum)就用自定义的枚举TypeHandler(上篇为EnumTypeHandler)进行转换。因为Mybatis在启动时就会经过TypeHandlerRegistry进行注册,即创建JdbcType, JavaType, TypeHandler三者之间的关系, 所以,这意味着在Mybatis启动时咱们也须要经过TypeHandlerRegistry将咱们的全部的枚举类型(JavaType)与自定义的枚举TypeHandler(EnumTypeHandler)创建联系。后端

为了方便你们理解, 贴上Mybatis中的TypeHandlerRegistry的相关部分源码:session

实战

SqlSessionFactoryBean

因为咱们项目使用了Spring, 是用Spring集成的Mybatis(废话,你们都是这么干的)。Spring经过SqlSessionFactoryBean来初始化启动Mybatis。 所以,咱们应该在它身上下手,然而,一切并非那么顺利。mybatis

查看了一下SqlSessionFactoryBean的源码,发现SqlSessionFactoryBean并无任何地方可让咱们切入, 进而来调用TypeHandlerRegistry进行注册咱们的枚举。 更使人蛋疼的是其全部属性全是private, 这下不只AOP切入不行,连经过继承偷懒都不行了。app

做罢,咱只有老老实实的重写一遍SqlSessionFactoryBean的代码了(copy还不简单)。post

DefaultSqlSessionFactoryBean

代码量比较多,就只贴关键代码了。步骤以下:ui

  1. DefaultSqlSessionFactoryBean继承SqlSessionFactoryBean。
  2. 将SqlSessionFactoryBean中的代码所有copy到DefaultSqlSessionFactoryBean。
  3. 调用如下方法。

切记, 以上代码要在这个代码以前执行:spa

由于, xmlMapperBuilder.parse()方法会开始解析咱们全部的全部mapper.xml的配置文件了,这时候会把resultMap也解析了,这就会致使咱们自定义的TypeHandler不生效。
切记! 切记code

最后

以上,代码算是完工了,记得在Spring的配置文件中, 将SqlSessionFactoryBean替换为咱们的DefaultSqlSessionFactoryBean。 否则咱们的活就是白干了。

接下来,就能够开始浪了, 以前咱们须要这样写:

<resultMap>
    ...
    <result column="status" jdbcType="TINYINT" property="status" typeHandler="xxx.xxx.EnumTypeHandler" />
    ...
</resultMap>

而如今,咱们能够不写typeHandler了。

<resultMap>
    ...
    <result column="status" jdbcType="TINYINT" property="status" />
    ...
</resultMap>

好啦,本次就写到这儿。

相关文章
相关标签/搜索