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>
上述方法在没有任何附加组件的情况下可以很好地工作