0x00:前言参考
之前的《MyBatis 中 SqlMapConfig 配置文件详解》记了一下 MyBatis 中的核心配置文件各个标签的作用和使用场景,这篇文章细说一下配置文件中 objectFactory 标签的详细使用。
0x01:标签介绍
在 MyBatis 中,当其 sql 映射配置文件中的 sql 语句所得到的查询结果,被动态映射到 resultType 或其他处理结果集的参数配置对应的 Java 类型,其中就有 JavaBean 等封装类。而 objectFactory 对象工厂就是用来创建实体对象的类。
在 MyBatis 中,默认的 objectFactory 要做的就是实例化查询结果对应的目标类,有两种方式可以将查询结果的值映射到对应的目标类,一种是通过目标类的默认构造方法,另外一种就是通过目标类的有参构造方法。
有时候在 new 一个新对象(构造方法或者有参构造方法),在得到对象之前需要处理一些逻辑,或者在执行该类的有参构造方法时,在传入参数之前,要对参数进行一些处理,这时就可以创建自己的 objectFactory 来加载该类型的对象。
0x02:配置解读
如果要改写默认的对象工厂,可以继承 DefaultObjectFactory 来创建自己的对象工厂,从而改写相关的 4 个方法,如下:
public class MyObjectFactory extends DefaultObjectFactory {
//处理默认构造方法
public Object create(Class type){
return super.create(type);
}
//处理有参构造方法
public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs){
return super.create(type, constructorArgTypes, constructorArgs);
}
//处理参数
public void setProperties(Properties properties){
super.setProperties(properties);
}
//判断集合类型参数
public <T> boolean isCollection(Class<T> type){
return Collection<E>.class.isAssignableFrom(type);
}
}
写好自己的对象工厂之后,在 MyB