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信息。

标签: none

添加新评论