我们有以下课程
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文件中配置类型处理程序?
答案 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)