Mybatis---05Mybatis配置文件浅析(三)

时间:2020-06-13 09:30:10   收藏:0   阅读:43

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();
    }
}

 

原文:https://www.cnblogs.com/jenne-blog/p/13111491.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!