1.objectFactory:(对象工厂)MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。说简单点这个对象工厂就是用来创建实体类的。

  1):怎么用?

    自定义的类继承ObjectFactory 接口的实现类DefaultObjectFactory,通过默认无参构造方法或者通过存在的参数映射来调用带有参数的构造方法

  2):步骤

    A:创建一个需要用对象工厂创建的类User

public class User {
private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

    B:创建自己的对象工厂类MyObjectFactory并继承DefaultObjectFactory类,并重写父类方法。

public class MyObjectFactory extends DefaultObjectFactory {

    //使用默认构造方法创建对象实例
@Override
public <T> T create(Class<T> type) {
if (type.equals(User.class)){
User u = (User)super.create(type);
u.setName("zhaozhiyong");
u.setAge(1);
return (T) u;
}
return super.create(type);
} //有构造参数列表和构造参数值列表的创建对象实例的方式
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
} //为自定义ObjectFactory设置配置参数
@Override
public void setProperties(Properties properties) {
//输出设置的配置参数
Iterator iterator = properties.keySet().iterator();
while (iterator.hasNext()){
String keyValue = String.valueOf(iterator.next());
System.out.println(properties.getProperty(keyValue));
}
super.setProperties(properties);
} //为List、Collection、Map等接口创建对象实例
@Override
protected Class<?> resolveInterface(Class<?> type) {
return super.resolveInterface(type);
} //检测指定类型是否为集合类型,主要处理java.util.Collection及其子类
@Override
public <T> boolean isCollection(Class<T> type) {
return super.isCollection(type);
}
}

    C:在mybatis配置文件mybatis-config.xml 中注册这个类,并设置子标签注入一些初始参数

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration j
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybook?characterEncoding=UTF-8"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties> <objectFactory type="com.james.mybatis.factory.MyObjectFactory">
<property name="someProperty" value="100"/>
<property name="someProperty1" value="张三"/>
</objectFactory> <environments default="test">
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments> <!--告知持久层接口的映射文件在哪里-->
<mappers>
<package name="com.james.mybatis.dao"/>
</mappers>
</configuration>

    D:编写测试类

public class Main {
public static void main(String[] args) throws IOException { //1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用这个时调用MyObjectFactory里面的setProperties方法,把objectFactory标签里面的参数注入进去
SqlSessionFactory factory = builder.build(in); //调用MyObjectFactory类的create方法创建一个User实例
User user = new MyObjectFactory().create(User.class);
System.out.println(user); in.close();
}
}

最新文章

  1. FMX保存JPG格式的Stream
  2. oracle dblink的创建方式
  3. HDU 1710
  4. SGU 455 Sequence analysis(Cycle detection,floyd判圈算法)
  5. linux下查看某软件是否已安装, ubuntu安装deb包
  6. struts返回json
  7. [ZOJ 1004] Anagrams by Stack (简单搜索)
  8. [iOS微博项目 - 1.5] - NavigationBar标题按钮
  9. getClassInstances --通过类的实例来得到数据
  10. 全世界最详细的一步一步搭建RAC步骤(一)---安装操作系统RHEL4.6【weber出品】
  11. jenkins与rebotframework搭配
  12. line-height属性总结
  13. 用py2exe将python文件转换成exe可执行程序
  14. VMware Workstation Pro下载密钥
  15. Java SE之调整JVM内存笔记
  16. Spring Aware接口
  17. js判断上传图片文件大小,尺寸,格式
  18. 【第八课】php-fpm.conf配置文件解析
  19. 拥抱.NET Core系列:MemoryCache 缓存选项 (转载)
  20. @@identity、scope_identity()、IDENT_CURRENT(&#39;tablename&#39;)函数的区别

热门文章

  1. MySQL中concat()、concat_ws()、group_concat()函数的使用技巧与心得总结
  2. 数据结构 - 堆(Heap)
  3. ORA-00060: Deadlock detected 模拟死锁产生与解决方案
  4. Centos-重定向方式打包、备份、还原、恢复工具-cpio
  5. Mac系统下的zip压缩包解压到Windows下出现乱码的解决方法
  6. error C2065: “uint8_t”: 未声明的标识符
  7. Nginx作为反向代理时传递客户端IP的设置方法
  8. HTML CSS+JS想要做放大镜练习,如何获取同样的大图和小图?
  9. map的自动扩容与手动缩容
  10. BUUCTF_web_三