文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.5 ObjectFactory
当 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论