Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在iBATIS中将参数化类用作resultClass_Java_Generics_Ibatis - Fatal编程技术网

Java 如何在iBATIS中将参数化类用作resultClass

Java 如何在iBATIS中将参数化类用作resultClass,java,generics,ibatis,Java,Generics,Ibatis,我们有以下课程 public class TemporalData<T> { private T data; private String opCode; private Date updateTime; // getters, setters } public class Employee { private String name; private int age; private Date dob; // get

我们有以下课程

public class TemporalData<T> {
    private T data;
    private String opCode;
    private Date updateTime;
    // getters, setters
}

public class Employee {
    private String name;
    private int age;
    private Date dob;
    // getters, setters
}
比如说,我们有一个employee_log表,其中包含employee的所有字段和两个附加列opCode、updateTime

假设这是一种适用于所有日志表的模式,在这种情况下,我们几乎没有其他列。在本例中,我们希望有一个单独的类,可以满足所有时态数据的需求,因此是参数化类


现在,如果我们必须获取属性在给定时间内发生更改的员工,并且希望DAO层返回TemporalData类型的对象,那么有人能解释如何实现ibatis TypeHandler来处理这种情况吗?应该如何在sqlmap xml文件中配置类型处理程序?

在多个包中对ibatis类进行了大量挖掘之后,以下方法对我很有效。在ibatis可用的唯一一本书中找不到有关此方法的任何文档,也找不到任何内容-ibatis正在运行

步骤1:添加自定义ResultObjectFactory。ResultObjectFactory接口的Classdoc解释了它是什么以及它的行为

public class TemporalDataResultObjectFactory implements ResultObjectFactory {

    /*
     * (non-Javadoc)
     * 
     * @see
     * com.ibatis.sqlmap.engine.mapping.result.ResultObjectFactory#createInstance
     * (java.lang.String, java.lang.Class)
     */
    @Override
    public Object createInstance(String statementId,
            @SuppressWarnings("rawtypes") Class clazz)
            throws InstantiationException, IllegalAccessException {

        if (!statementId.startsWith("_td_")) {
            return null;
        }

        TemporalData<Object> temporalResult = new TemporalData<Object>();
        Object dataObject = clazz.newInstance();
        temporalResult.setData(dataObject);

        return temporalResult;
    }
    /*
     * (non-Javadoc)
     * 
     * @see
     * com.ibatis.sqlmap.engine.mapping.result.ResultObjectFactory#setProperty
     * (java.lang.String, java.lang.String)
     */
    @Override
    public void setProperty(String arg0, String arg1) {
        // TODO Auto-generated method stub

    }

}
步骤2:将上述ResultObjectFactory添加到sql映射配置

<resultObjectFactory type="TemporalDataResultObjectFactory" />
步骤3:在所有结果为临时数据的ibatis语句ID前面加上“td”

例如:

<select id="_td_getTemporalEmployees" resultMap="temporalEmployee">
    SELECT  name, age, opCode, updateTime
    FROM    employee 
    WHERE   updateTime BETWEEN #startTime# AND #endTime#
</select>
<resultMap class="Employee" id="temporalEmployee">
    <result property="data.name" column="name" javaType="String"/>
    <result property="data.age" column="age"  javaType="long"/>
    <result property="data.bidPrice" column="bid_price"  javaType="int"/>
    <result property="data.dob" column="dob" javaType="java.util.Date"/>
    <result property="opCode" column="opCode" javaType="String"/>
    <result property="updateTime" column="updateTime" javaType="java.util.Date"/>
</resultMap>
步骤4:使用实际类定义结果映射,例如:如果希望结果为TemporalData,则将该类设置为“Employee”,但属性与TemporalData类相同

例如:

<select id="_td_getTemporalEmployees" resultMap="temporalEmployee">
    SELECT  name, age, opCode, updateTime
    FROM    employee 
    WHERE   updateTime BETWEEN #startTime# AND #endTime#
</select>
<resultMap class="Employee" id="temporalEmployee">
    <result property="data.name" column="name" javaType="String"/>
    <result property="data.age" column="age"  javaType="long"/>
    <result property="data.bidPrice" column="bid_price"  javaType="int"/>
    <result property="data.dob" column="dob" javaType="java.util.Date"/>
    <result property="opCode" column="opCode" javaType="String"/>
    <result property="updateTime" column="updateTime" javaType="java.util.Date"/>
</resultMap>

步骤5:确保上面定义的resultMap中的所有属性都正确设置了javaType,否则,ibatis会在验证期间抛出异常,抱怨设置程序不可用

从我的一位同事那里了解到一个更好、更简单的解决方案

<resultMap class="Employee" id="employee">
    <result property="name" column="name"/>
    <result property="age" column="age"/>
    <result property="bidPrice" column="bid_price"/>
    <result property="dob" column="dob"/>
</resultMap>

<resultMap class="Temporal" id="temporalEmployee">
    <result property="data" resultMap="employee"/>
    <result property="opCode" column="opCode" javaType="String"/>
    <result property="updateTime" column="updateTime" javaType="java.util.Date"/>
</resultMap>
上述方法在没有任何附加组件的情况下可以很好地工作