MyBatis在Oracle中插入資料並返回主鍵的問題解決

bladestone發表於2014-05-12

引言:  在MyBatis中,希望在Oracle中插入資料之時,同時返回主鍵值,而非插入的條數...

環境:MyBatis 3.2 , Oracle, Spring 3.2

  SQL Snippet in XML Configuration:

<insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo">
    <selectKey resultType="java.math.BigDecimal" order="BEFORE" keyProperty="id">
	   SELECT U_USER_INFO_SEQ.Nextval as ID from DUAL
   </selectKey>
	
    insert into U_USER_INFO
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="id != null" >
        ID,
      </if>
      <if test="userName != null" >
        USER_NAME,
      </if>
      <if test="realName != null" >
        REAL_NAME,
      </if>
    .....
</insert>

要點是這裡使用了selectKey來定義返回新生成的PrimaryKey,這個情況僅僅適用於Oracle。

需要注意的地方是在Java程式碼中使用Integer型別,但是在MyBatis的對映檔案中,使用java.math.BigDecimal型別,否則會報型別轉換或者不匹配的錯誤。

其他比如MySQL或者SQLServer的情況適用於以下情況:

    <insert id="insert" parameterType="Spares"   
            useGeneratedKeys="true" keyProperty="id">  
            insert into spares(spares_id,spares_name,  
                spares_type_id,spares_spec)  
            values(#{id},#{name},#{typeId},#{spec})  
        </insert>  
使用useGeneratedKeys/KeyProperty來實現插入資料的時候,來完成新生成主鍵的返回。


其中異常資訊的解決:

異常資訊:

   org.springframework.jdbc.UncategorizedSQLException: Error getting generated key or setting result to parameter object. Cause: java.sql.SQLException: 無效的列型別: getBigDecimal not implemented for class oracle.jdbc.driver.T4CRowidAccessor
; uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 無效的列型別: getBigDecimal not implemented for class oracle.jdbc.driver.T4CRowidAccessor; nested exception is java.sql.SQLException:
無效的列型別: getBigDecimal not implemented for class oracle.jdbc.driver.T4CRowidAccessor


問題解決:

    問題是在Java程式碼中設定返回的主鍵資料型別,其中返回的資料型別為java.lang.Integer,而非BigDecimal和Long. 但是在MyBatis中的對映檔案中的型別為java.math.BigDecimal.



相關文章