?
前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
前言:我早期用過這個方法,但是返回的依舊是影響行數,不是主鍵。
只是這種寫法可以達到我要的效果:
用selectKey?,在insert 執行成功后,對象的ID屬性已經被 MyBatis 賦值了,可以直接對象.id 取到主鍵值。?
?
?
?
引言:? 在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.
?