2011-07-15 71 views
0

我有一個使用自動生成的列生成的表,但我無法使用MyBatis檢索ID。我已經通過測試證明SQL正在工作,並且行正在插入,但我無法獲取生成的ID。使用MyBatis從DB2獲取生成的密鑰

XML配置是:

<insert id="insertRequestTrackingRow" parameterType="map"> 
    INSERT INTO XML_LOG_T (REQ_SRC_SYS_CDE, REQ_USR_ID, REQ_XML_DOC, ROW_CRT_DTM, ROW_UPDT_DTM) 
    VALUES (#{sourceSystemCode}, #{userID}, #{message}, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) 
</insert> 

在XML_LOG_T是列,REQ_ID,即自動生成的。我的映射器接口:

public interface UdbDataMapper { 
    int insertRequestTrackingRow(
      @Param("message") String message, 
      @Param("sourceSystemCode") String sourceSystemCode, 
      @Param("userID") String userID); 
} 

返回什麼始終是1,我相信這是插入的記錄數。我相信我錯過了一些明顯的東西,但看不到樹木。

回答

1

下面是如何做到這一點相當不錯explanation

基本上,您必須在INSERT語句的XML配置中使用useGeneratedKeys =「true」和keyproperty =「keyfield」屬性。然後將返回的鍵字段值插入到您的參數對象中,並可從此處進行檢索。如下面的代碼示例的東西應該工作:

SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("sqlConfig.xml")); 
SqlSession sess = sqlMapper.openSession(); 
try { 
    Map<String,String> paramObj = new HashMap<String,String>(); 
    paramObj.put("param1", "value"); 
    int result = sess.insert("insertRequestTrackingRow", paramObj); 
    System.out.println("REQ_ID: " + paramObj.get("REQ_ID")); 
} 
finally { 
    sess.close(); 
} 
+0

是的,我已經看到了文檔中的那些屬性,但他們依靠我的傳遞對象到數據庫中,對不對?我寧願不發明一個對象,只是爲了將數據導入數據庫並重新生成密鑰,但也許這是唯一的方法。 – Mark

+0

生成的鍵值將被插入到您使用的任何參數對象中,只要它具有MyBatis可用於設置該值的設置器即可。請參閱上面我的回覆中的編輯代碼。 –

+0

當你說「只要它有一個setter」,這一切都變得清晰。我實際上改變了我的實現,現在正在傳遞一個對象,但是你的回答非常有幫助。謝謝。 – Mark

0

怎麼樣

<insert id="insertRequestTrackingRow" parameterType="map" 
     useGeneratedKeys="true" keyProperty="id"> 
    INSERT INTO XML_LOG_T (REQ_SRC_SYS_CDE, REQ_USR_ID, REQ_XML_DOC, ROW_CRT_DTM, ROW_UPDT_DTM) 
    VALUES (#{sourceSystemCode}, #{userID}, #{message}, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) 
</insert>