mybatis实践-objectFactory对象工厂

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后面进行的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值