欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Springboot整合MyBatis(六:Mybatis的xml配配置文件,详细配置之类对象工厂(objectFactory)查询是创建对象实例操作一下)

程序员文章站 2022-03-08 15:36:52
...

每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现

这是官网对其做的一个解释,说的意思是:我们在通过select语句查询数据库时,查询的结果集会映射到我们指定的javaBean上面。比如查一个集合List,那么集合里面的每一个元素在创建实例的时候,如果不设置,就会通过DefaultObjectFactory 类的下面两个方法创建实例(其中一个,要么无参构造函数,要么有参构造函数):

	public Object create(Class type) {
    return super.create(type);
  }
  public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {
    return super.create(type, constructorArgTypes, constructorArgs);
  }

如果我们希望他在创建实例的时候,做一些动作,至于做什么动作,根据实际业务需求。
那么我们就来实操一把:

第一步、创建MyObjectFactory继承org.apache.ibatis.reflection.factory.DefaultObjectFactory并覆盖create方法,如果是有参构造函数,就覆盖有参构造函数,如果是无参构造函数,就覆盖无参构造函数

如果在覆盖的时候需要一些参数,可以通过在配置的时候,配置文件中的property标签进行传递。

package com.osy.config;

import org.apache.ibatis.reflection.factory.DefaultObjectFactory;

import java.util.List;

public class MyObjectFactory extends DefaultObjectFactory {
    @Override
    public <T> T create(Class<T> type) {
        System.out.println("生成实例【无参】");
        return super.create(type);
    }

    @Override
    public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
        System.out.println("生成实例【有参】");
        return super.create(type, constructorArgTypes, constructorArgs);
    }
    
	@Override
    public void setProperties(Properties 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);
    }
}

第二步、在配置文件中配置

	<objectFactory type="com.osy.config.MyObjectFactory">
        <property name="test" value="test"/>
    </objectFactory>

这里的property 标签的值会传递到setProperties方法中properties参数中。
至于这个有什么用,不清楚,要传递可以通过Properties传递,这里传递,确实不知道干什么的。

第三步、测试 随便查询一个:看控制台打印


随便查询一个:看控制台打印

生成实例【无参】
生成实例【有参】
生成实例【无参】
生成实例【有参】

为什么打印了两次?原因不明,待研究…