2011-09-28 53 views
4

使用參數化類作爲resultClass我們有下面的類如何在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表,員工和幾個其他列的所有領域(操作碼,錄入)

假設這是對我們有一些額外的列(在這種情況下,操作碼,錄入)所有日誌表的模式,我們希望有一個單一的類,它可以迎合所有的時間數據,因此參數化類。

現在,如果我們必須獲取在給定的持續時間內屬性發生變化並想要DAO層返回的類型爲TemporalData的對象,任何人都可以解釋如何實現ibatis TypeHandler來處理這種情況?應如何處理類型中的SqlMap XML文件進行配置?

回答

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> 

上述方法將沒有任何附加組件工作。

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

<resultObjectFactory type="TemporalDataResultObjectFactory" /> 

第3步:前綴所有ibatis的聲明IDS,其結果是 'TD' 時間數據。

例如:

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

步驟4:定義結果地圖與實際的類(例如:如果要得到的結果是TemporalData,那麼類設置爲「僱員」),但與屬性每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的所有屬性已java類型適當設置(否則,ibatis的拋出驗證抱怨無法制定者中的例外)