返回介绍

3.5 ObjectFactory

发布于 2025-04-26 13:08:32 字数 3164 浏览 0 评论 0 收藏

当 MyBatis 在构建一个结果返回的时候,都会使用 ObjectFactory(对象工厂)去构建 POJO,在 MyBatis 中可以定制自己的对象工厂。一般来说我们使用默认的 ObjectFacotry 即可,MyBatis 中默认的 ObjectFacotry 是由 org.apache.ibatis.reflection.factory.DefaultObject Factory 来提供服务的。在大部分的场景下我们都不用修改,如果要定制特定的工厂则需要进行配置,如代码清单 3-25 所示。

代码清单 3-25:定义新的 ObjectFactory

<objectFactory type="com.learn.chapter3.objectFactory.MyObjectFactory">
                <property name="name" value="MyObjectFactory" />
</objectFactory>

我们这里配置了一个对象工厂 MyObjectFactory,对它的要求是实现 ObjectFactory 的接口。实际上 DefaultObjectFactory 已经实现了 ObjectFactory 的接口,我们可以通过继承 DefaultObjectFactory 来简化编程。下面给出它的实现代码和测试结果,如代码清单 3-26 所示。

代码清单 3-26:MyObjectFactory.java

package com.learn.chapter3.objectFactory;
import java.util.List;
import java.util.Properties;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.log4j.Logger;
public class MyObjectFactory extends DefaultObjectFactory {

        private static final long serialVersionUID = -3814827216040286292L;
        Logger log = Logger.getLogger(MyObjectFactory.class);

    @Override
    public void setProperties(Properties prprts) {
        log.info("定制属性:"+prprts);
        super.setProperties(prprts);
    }

    @Override
    public <T> T create(Class<T> type) {
        log.info("使用定制对象工厂的 create 方法构建单个对象");
        return super.create(type);
    }

    @Override
    public <T> T create(Class<T> type, List<Class<?>> list, List<Object> list1) {
        log.info("使用定制对象工厂的 create 方法构建列表对象");
        return super.create(type, list, list1);
    }

    @Override
    public <T> boolean isCollection(Class<T> type) {
        return super.isCollection(type);
    }
}

这里并没有实现额外的功能,只是做一下测试而已,如果定制需要自己编写里面的逻辑。让我们运行一下,查看其运行的结果。

DEBUG 2016-02-03 11:50:45,956 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.jdbc. JDBC4Connection@eec5a4a]
DEBUG 2016-02-03 11:50:45,956 org.apache.ibatis.logging.jdbc. BaseJdbc Logger: ==>  Preparing: select id, user_name, cnname, birthday, sex, email, mobile, note from t_user where id = ? 
DEBUG 2016-02-03 11:50:46,006 org.apache.ibatis.logging.jdbc. BaseJdbc Logger: ==> Parameters: 1(Long)
 INFO 2016-02-03 11:50:46,016 com.learn.chapter3.objectFactory. MyObject Factory: 使用定制对象工厂的 create 方法构建单个对象
 INFO 2016-02-03 11:50:46,016 com.learn.chapter3.objectFactory. MyObject Factory: 使用定制对象工厂的 create 方法构建列表对象
 INFO 2016-02-03 11:50:46,026 com.learn.chapter3.objectFactory.MyObject Factory: 使用定制对象工厂的 create 方法构建单个对象
 INFO 2016-02-03 11:50:46,026 com.learn.chapter3.objectFactory. MyObject Factory: 使用定制对象工厂的 create 方法构建列表对象
DEBUG 2016-02-03 11:50:46,036 org.apache.ibatis.logging.jdbc. BaseJdbc Logger: <==      Total: 1
DEBUG 2016-02-03 11:50:46,036 org.apache.ibatis.transaction.jdbc. Jdbc Transaction: Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@eec5a4a]

从运行的结果可以看出,首先,setProperties 方法可以使得我们如何去处理设置进去的属性,而 create 方法分别可以处理单个对象和列表对象。其次,我们配置的 ObjectFactory 已经生效。注意,大部分的情况下,我们不需要使用自己配置的 ObjectFactory,使用系统默认的即可。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。