最后,还可以让MyBatis查找类型处理器:
注意在使用自动检索(autodiscovery)功能的时候,只能通过注解的方式来指定JDBC类型。
你能创建一个泛型类型处理器,它可以处理多于一个类。为达到此目的,需要增加一个接收该类作为参数 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 的构造器,这样在构造一个类型处理器的时候MyBatis就会传入一个具体的类。
二、处理枚举类型
1、映射枚举类型
若想映射枚举类型Enum,则需要从EnumTypeHandler或者EnumOrdinalTypeHandler中选一个来使用
比如说我们想存储近似值时用到的舍入模式。默认情况下,MyBatis会利用EnumTypeHandler来把Enum值转换成对应的名字。
注意EnumTypeHandler在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,它会处理任意继承了Enum的类。
不过,我们可能不想存储名字,相反我们的DBA会坚持使用整形值代码。那也一样轻而易举;在配置文件中把EnumOrdinalTypeHandler加到typeHandlers中即可,这样每个RoundingMode将通过他们的序数值来映射成对应的整形。
2、xml配置文件
但是怎么样能将同样的Enum既映射成字符串又映射成整形呢?
自动映射器(auto-mapper)会自动选用EnumOrdinalTypeHandler来处理,所以如果我们想用普通的EnumTypeHandler,就非要为那些SQL语句显示地设置要用到的类型处理器不可。
select * from users
<insert id=
“insert”> insert into users (id, name, funkyNumber, roundingMode) values
( #{id}, #{name}, #{funkyNumber},
#{roundingMode})
select * from users2
<insert id=
“insert2”> insert into users2 (id, name, funkyNumber, roundingMode) values(
#{id}, #{name}, #{funkyNumber}, #{roundingMode, typeHandler=
org.apache.ibatis.type.EnumTypeHandler})
注意,这里的select语句强制使用resultMap来代替resultType。
三、对象工厂(objectFactory)
MyBatis每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。如果想覆盖对象工厂的行为,则可以通过创建自己的对象工厂来实现,比如:
public class ExampleObjectFactory extends DefaultObjectFactory {
public Object create(Class type) {
return super.create(type);
}
public Object create(Class type, List constructorArgTypes, List constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
}
public void setProperties(Properties pr