Mybatis 自定义ObjectFactory

六月ゝ 毕业季﹏ 提交于 2020-01-13 22:11:05

对象工厂(objectFactory)

Mybatis 每次创建新的对象的时候,都会通过objectFactory进行创建实例,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。要想覆盖其行为,就要自定义objectFactory
自定义objectFactory方法:继承DefaultObjectFactory类:
这里加了个参数打印的代码:
package com.jym.util;

import com.jym.bean.User;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;

import java.util.Collection;
import java.util.List;
import java.util.Properties;

public class JymObjectFactory extends DefaultObjectFactory {

    // 处理有参构造
    @Override
    public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
        final T entity = super.create(type, constructorArgTypes, constructorArgs);
        if(entity instanceof com.jym.bean.User){
            User user = (User)entity;
            System.out.println("已将查询结果封装为"+user.getClass());
        }
        return super.create(type, constructorArgTypes, constructorArgs);
    }

    // 处理默认无参构造
    public Object create(Class type) {
        System.out.println("创建对象类型:"+type.toString());
        return super.create(type);
    }

    // 处理参数
    public void setProperties(Properties properties) {
        super.setProperties(properties);
        System.out.println(properties.toString());
    }

    // 判断结果集是否是集合,如果返回的集合,设置返回的类型为实体类,则报错
    public <T> boolean isCollection(Class<T> type) {
        System.out.println("是否是集合"+Collection.class.isAssignableFrom(type));
        return Collection.class.isAssignableFrom(type);
    }

}

    <!-- 配置objectFactory 实例化查询结果对应的目标类-->
    <objectFactory type="com.jym.util.JymObjectFactory">
        <property name="jymProp" value="jym"/>
    </objectFactory>
测试代码
    @Test
    public void test() throws IOException {
        // xml路径
        String resource = "mybatis-config.xml";
        // 读取配置文件,获取输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 从 SqlSessionFactory 中获取 SqlSession
        SqlSession session = sqlSessionFactory.openSession();
        // 取得mapper对象(代理对象)
        UserDao mapper = session.getMapper(UserDao.class);
        // 调用方法
        List<User> users = mapper.selectUserByName("jym");
        System.out.println(users.toString());
    }

世界上有10种人,一种是懂二进制的,一种是不懂二进制的。

感谢您的收看,如有哪里写的不对 请留言,谢谢。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!