mybatis实践-objectFactory对象工厂
前言
- 概念
截图来自http://www.mybatis.org/mybatis-3/zh/configuration.html#objectFactory
-
理解
根据文档的说明objectFactory是每次返回数据时,会利用objectFactory来生产一个实例的目标类,那么如果我们默认的映射关系和初始化不能满足我们的要求的时候,我们就可以自定义objectFactory了。
下面进行实践
实践
实践背景
假设有一个”非常规的需求“:=_= 假设返回的user的对象需要知道当前运行环境的特点id值,那么此处就可以使用objectFactory。
操作步骤
1、继承DefaultObjectFactory
2、重写create方法
代码如下
package com.learing.mybatis.util;
import com.learing.mybatis.beans.User;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import java.util.List;
/**
* 自定义对象工厂
*
* @author dsdj
* @version 1.0
* @className MyObjectFactory
* @date 2019/4/13 下午3:21
**/
public class MyObjectFactory extends DefaultObjectFactory {
@Override
public <T> T create(Class<T> type) {
if (type == User.class){
// 如果是用户类 先创建实例
User user = (User) super.create(type);
// 在这个时候,user是里面的值是空值 create只是创建新的实例,并没有赋值,而是在后面赋值
// 所以如果利用objectFactory进行设置实例的值,需要考虑后面赋值会产生覆盖
// 但是这里可以进行赋值一些数据库不存在的字段
user.setId(1111111);
user.setSysId("设置本运行环境的id:123");
return (T) user;
}
return super.create(type);
}
@Override
public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs) {
return super.create(type, constructorArgTypes, constructorArgs);
}
}
3、配置objectFactory
在mybatis配置文件中设置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"> </properties>
<objectFactory type="com.learing.mybatis.util.MyObjectFactory"></objectFactory>
<environments default="development">
<environment id="development">
<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>
<mapper resource="mapping/userMapper.xml"/>
</mappers>
</configuration>
测试
@Test
public void testMyObjectHandler(){
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
System.out.println();
}
可以看到自定义的objectFactory中设置的id值(”11111“)被重写了
总结
在debug的调试过程中可以发现,在objetFactory在创建实例时属性值并不存在,赋值是在objectFactory后面进行的。