For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
昆明IT培训的小编这一期给大家讲Mybatis实战之TypeHandler高级进阶。
注册完我们自定义的TypeHandler后,还得告诉Mybatis只要一遇到我们指定的枚举类型就用自定义的枚举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>
了解详情请登陆昆明达内IT培训官网(km.tedu.cn)!