Mybatis实战之TypeHandler高级进阶
上篇文章分享了在项目实战中自定义Mybatis的TypeHandler来处理枚举类型。文章结尾也指出了美中不足之处,那就是每次都需要指定我们自定义的枚举TypeHandler。 随着项目枚举类型的增多,每次都要写一遍这个会令人很反感。那么,本次我们就来解决这一痛点。
思路分析
上篇文章讲到, mybatis有默认的处理枚举类型的TypeHandler,因此,我们要将我们自定义的枚举TypeHandler注册进入Mybatis。
注册完我们自定义的TypeHandler后,还得告诉Mybatis只要一遇到我们指定的枚举类型(上篇的DisplayedEnum)就用自定义的枚举TypeHandler(上篇为EnumTypeHandler)进行转换。由于Mybatis在启动时就会通过TypeHandlerRegistry进行注册,即建立JdbcType, JavaType, TypeHandler三者之间的关系, 因此,这意味着在Mybatis启动时我们也需要通过TypeHandlerRegistry将我们的所有的枚举类型(JavaType)与自定义的枚举TypeHandler(EnumTypeHandler)建立联系。
为了方便大家理解, 贴上Mybatis中的TypeHandlerRegistry的相关部分源码:

实战
SqlSessionFactoryBean
由于我们项目使用了Spring, 是用Spring集成的Mybatis(废话,大家都是这么干的)。Spring通过SqlSessionFactoryBean来初始化启动Mybatis。 因此,我们应该在它身上下手,然而,一切并不是那么顺利。
查看了一下SqlSessionFactoryBean的源码,发现SqlSessionFactoryBean并没有任何地方可以让我们切入, 进而来调用TypeHandlerRegistry进行注册我们的枚举。 更令人蛋疼的是其所有属性全是private, 这下不仅AOP切入不行,连通过继承偷懒都不行了。

作罢,咱只有老老实实的重写一遍SqlSessionFactoryBean的代码了(copy还不简单)。
DefaultSqlSessionFactoryBean
代码量比较多,就只贴关键代码了。步骤如下:
- DefaultSqlSessionFactoryBean继承SqlSessionFactoryBean。
- 将SqlSessionFactoryBean中的代码全部copy到DefaultSqlSessionFactoryBean。
- 调用以下方法。

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

因为, 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>
好啦,本次就写到这儿。
我的博客: javafan.cn
Mybatis实战之TypeHandler高级进阶的更多相关文章
- 最新Python3.6从入门到高级进阶实战视频教程
点击了解更多Python课程>>> 最新Python3.6从入门到高级进阶实战视频教程 第1篇 Python入门导学 第2篇 Python环境装置 第3篇 了解什么是写代码与Pyth ...
- 【转】mybatis实战教程(mybatis in action),mybatis入门到精通
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis ...
- mybatis实战教程(mybatis in action),mybatis入门到精通
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...
- mybatis实战教程(mybatis in action),mybatis入门到精通(转)
转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...
- MyBatis实战之解析与运行
本次所谈的原理仅仅只涉及基本的框架和核心代码,并不会全部都说到,比如关于MyBatis是如何解析XML文件和其他配置文件从而的到内容,还有就是JDBC如何使用,关于JDBC如何使用,可以参考我的这篇博 ...
- MyBatis实战之配置
MyBatis最重要的配置也就两个,一个是mybatis-config.xml,又称MyBatis的全局配置,另一个就是XXXDao.xml或XXXMapper.xml映射配置. mybatis-co ...
- 1.mybatis实战教程mybatis in action之一开发环境搭建
转自:https://www.cnblogs.com/shanheyongmu/p/5652471.html 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框 ...
- 一凡老师亲录视频,Python从零基础到高级进阶带你飞
如需Q群交流 群:893694563 不定时更新2-3节视频 零基础学生请点击 Python基础入门视频 如果你刚初入测试行业 如果你刚转入到测试行业 如果你想学习Python,学习自动化,搭建自动化 ...
- 潭州学院-JavaVIP的Javascript的高级进阶-KeKe老师
潭州学院-JavaVIP的Javascript的高级进阶-KeKe老师 讲的不错,可以学习 下面是教程的目录截图: 下载地址:http://www.fu83.cn/thread-283-1-1.htm ...
随机推荐
- STM32串口寄存器操作(转)
源:STM32串口寄存器操作 //USART.C /************************************************************************** ...
- 【解决】System.Web.Http.Description 缺失
一.问题描述 使用visual studio 2013创建mvc4 api模板,然后build,run,broken,出错如下: Error 1 The type or namespace name ...
- android——网络操作(一)连接网络
连接网络 一,包含许可 <uses-permissionandroid:name="android.permission.INTERNET"/> <uses-pe ...
- CentOS Linux解决 Device eth0 does not seem to be present
通过OVF部署Linux主机后提示 ringing up interface eth0: Device eth0 does not seem to be present,delaying initi ...
- 译者序(Core Data 应用开发实践指南)
Core Data 是数据管理框架. 该书用Grocery Dude 购物管理程序来贯穿整个学习过程. 本书共分三个部分: 前7章为基础篇.从基础知识.迁移方式及扩展方式来讲解托管对象模型.怎么用图形 ...
- js dorado
1.dorado http://bsdn.org/projects/dorado7/deploy/sample-center/com.bstek.dorado.sample.Main.d#40350
- BZOJ2733 永无乡【splay启发式合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 响应HttpServletResponse
可以使用HttpServletResponse来对浏览器进行响应,大部分情况下,会使用setContentType()设置响应类型,使用getWriter()取得PrintWriter对象,而后使用P ...
- JS插件库
http://www.cnblogs.com/xiaoyao2011/category/327551.html
- 《Linux多线程服务端编程》笔记——线程同步精要
并发编程基本模型 message passing和shared memory. 线程同步的四项原则 尽量最低限度地共享对象,减少需要同步的场合.如果确实需要,优先考虑共享 immutable 对象. ...