欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mybatis实战之TypeHandler高级进阶

程序员文章站 2024-03-05 23:48:31
上篇文章分享了在项目实战中自定义mybatis的typehandler来处理枚举类型。文章结尾也指出了美中不足之处,那就是每次都需要指定我们自定义的枚举typehandle...

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

思路分析

  1. 上篇文章讲到, mybatis有默认的处理枚举类型的typehandler,因此,我们要将我们自定义的枚举typehandler注册进入mybatis。
  2. 注册完我们自定义的typehandler后,还得告诉mybatis只要一遇到我们指定的枚举类型(上篇的displayedenum)就用自定义的枚举typehandler(上篇为enumtypehandler)进行转换。由于mybatis在启动时就会通过typehandlerregistry进行注册,即建立jdbctype, javatype, typehandler三者之间的关系, 因此,这意味着在mybatis启动时我们也需要通过typehandlerregistry将我们的所有的枚举类型(javatype)与自定义的枚举typehandler(enumtypehandler)建立联系。

为了方便大家理解, 贴上mybatis中的typehandlerregistry的相关部分源码:

 Mybatis实战之TypeHandler高级进阶

实战

sqlsessionfactorybean

由于我们项目使用了spring, 是用spring集成的mybatis(废话,大家都是这么干的)。spring通过sqlsessionfactorybean来初始化启动mybatis。 因此,我们应该在它身上下手,然而,一切并不是那么顺利。

查看了一下sqlsessionfactorybean的源码,发现sqlsessionfactorybean并没有任何地方可以让我们切入, 进而来调用typehandlerregistry进行注册我们的枚举。 更令人蛋疼的是其所有属性全是private, 这下不仅aop切入不行,连通过继承偷懒都不行了。

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

defaultsqlsessionfactorybean

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

  1. defaultsqlsessionfactorybean继承sqlsessionfactorybean。
  2. 将sqlsessionfactorybean中的代码全部copy到defaultsqlsessionfactorybean。
  3. 调用以下方法。

Mybatis实战之TypeHandler高级进阶

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

Mybatis实战之TypeHandler高级进阶

因为, xmlmapperbuilder.parse()方法会开始解析我们所有的所有mapper.xml的配置文件了,这时候会把resultmap也解析了,这就会导致我们自定义的typehandler不生效。

切记! 切记

最后

以上,代码算是完工了,记得在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>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!