MyBatis ObjectFactory 对象工厂介绍
1、ObjectFactory 对象工厂简介
MyBatis框架本质是ORM工具,它能把数据库表的行记录映射成Java对象。在MyBatis框架中,一起对象的生成依靠ObjectFactory来实现,正如MyBatis创始人Clinton Begin所言:
MyBatis uses an ObjectFactory to create all needed new Objects.
2、自定义对象工厂
ObjectFactory是个接口类,其默认实现类是DefaultObjectFactory。在 MyBatis 中,默认的DefaultObjectFactory要做的就是实例化查询结果对应的目标类,有两种方式可以将查询结果的值映射到对应的目标类:一种是通过目标类的默认构造方法,另外一种就是通过目标类的有参构造方法。
MyBatis允许注册自定义的ObjectFactory,只需要实现接口 org.apache.ibatis.reflection.factory.ObjectFactory即可。但是在大部分的情况下,我们都不需要自定义ObjectFactory对象工厂,只需要继承系统已经实现好的 DefaultObjectFactory ,通过一定的改写来完成我们所需要的工作。
有时候在新建一个新对象(构造方法或者有参构造方法),在得到对象之前需要处理一些逻辑,或者在执行该类的有参构造方法时,在传入参数之前,要对参数进行一些处理,这时就可以创建自己的 ObjectFactory 来加载该类型的对象。如下所示,增加了日志打印功能:
public class MyObjectFactory extends DefaultObjectFactory
{
private static final long serialVersionUID = 1L;
Logger log = Logger.getLogger(MyObjectFactory.class);
private Object temp = null;
@Override
public void setProperties(Properties properties)
{
super.setProperties(properties);
}
@Override
public <T> T create(Class<T> type)
{
T result = super.create(type);
log.info("创建对象:" + result.toString());
return result;
}
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs)
{
T result = super.create(type, constructorArgTypes, constructorArgs);
log.info("创建对象:" + result.toString());
return result;
}
@Override
public <T> boolean isCollection(Class<T> type)
{
return super.isCollection(type);
}
}
然后,需要在 SqlMapConfig.xml 全局配置文件中配置该自定义对象工厂即可,代码如下:
<objectFactory type="cn.mybatis.mydemo.MyObjectFactory">
<property name="key" value="value" />
</objectFactory>
这样 MyBatis 就会采用配置的 MyObjectFactory 来生成结果集对象,采用下面的代码进行测试。
public class MyBatisDemo
{
public static void main(String[] args) throws IOException
{
Logger log = Logger.getLogger(MyBatisDemo.class);
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);
SqlSession session = factory .openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.getUser(1L);
}
}
代码说明:
在映射器UserMapper执行查询操作之后,会生成User对象,这个时候User对象就是利用MyObjectFactory来生成的,从而会打印出log信息。