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

时间:2011-09-28 08:07:37

标签: 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;
    // getters, setters
}

并说,我们有一个employee_log表,其中包含员工和其他几列的所有字段(opCode,updateTime)

假设这是所有日志表的模式,其中我们有很少的附加列(在本例中为opCode,updateTime),我们希望有一个单独的类可以满足所有时间数据,因此也适用于参数化类。

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

2 个答案:

答案 0 :(得分:3)

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

<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>

上述方法在没有任何其他组件的情况下运行良好。

答案 1 :(得分:2)

经过大量挖掘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-map-config

<resultObjectFactory type="TemporalDataResultObjectFactory" />

步骤3:使用“ td ”为结果为时态数据的所有ibatis语句ID添加前缀。

示例:

<select id="_td_getTemporalEmployees" resultMap="temporalEmployee">
    SELECT  name, age, opCode, updateTime
    FROM    employee 
    WHERE   updateTime BETWEEN #startTime# AND #endTime#
</select>

步骤4:使用实际类定义结果映射(例如:如果您希望结果为TemporalData,则将类设置为'Employee'),但是根据temporalData类使用属性。

示例:

<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会在验证期间抛出异常,抱怨不可用的setter)