iBatis下插入資料返回資料ID的問題
阿新 • • 發佈:2019-02-14
今天讓做SSI整合的東西,遇到了使用iBatis插入資料返回主鍵的問題。一開始按照自己的想法,在插入資料之後通過當前條資料的其他欄位將這條資料的主鍵查詢出來,結果當然是不滿意。然後在業務層,通過時間生成ID,不過也被人家給淘汰掉了。後來才突然想到iBatis下邊有selectkey元素,不過只是用過在oracle下邊的,不知道mySQL下邊有沒有。後來查詢了一下資料,才發現常用資料庫都是用這個屬性的。不過,這涉及到先生成和後生成的問題,不過貌似之後mySQL是後生成的,因為mySQL並沒有sequence序列麼。
iBatis的sqlMap配置檔案的selectKey元素有個type屬性,可以指定 pre或者post表示前生成(pre)還是後生成(post)。
Oracle設定
MS SQL Server配置
上述MS SQL Server配置隨是官網提供的配置,但實際上卻恰恰隱患重重!按下述配置,確保獲得有效主鍵。
MySQL配置
通過以上方式,可以最大程度上確保插入資料的時候獲得當前自增主鍵。
Oracle設定
- <!-- Oracle SEQUENCE -->
- <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
- <selectKey resultClass="int" keyProperty="id" type="pre">
-
<![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>
- </selectKey>
- <![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values(#id#,#description#)]]>
- </insert>
MS SQL Server配置
- <!-- Microsoft SQL Server IDENTITY Column -->
- <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
-
<![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) ]]>
- <selectKey resultClass="int" keyProperty="id" type="post">
- <![CDATA[SELECT @@IDENTITY AS ID ]]>
- <!-- 該方法不安全 應當用SCOPE_IDENTITY() 但這個函式屬於域函式,需要在一個語句塊中執行。 -->
- </selectKey>
- </insert>
上述MS SQL Server配置隨是官網提供的配置,但實際上卻恰恰隱患重重!按下述配置,確保獲得有效主鍵。
- <!-- Microsoft SQL Server IDENTITY Column 改進-->
- <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
- <selectKey resultClass="int" keyProperty="id">
- <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#)
- SELECT SCOPE_IDENTITY() AS ID ]]>
- </selectKey>
- </insert>
MySQL配置
- <!-- MySQL Last Insert Id -->
- <insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
- <![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values(#description#)]]>
- <selectKey resultClass="int" keyProperty="id">
- <![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>
- <!-- 該方法LAST_INSERT_ID()與資料庫連線繫結,同屬統一會話級別,不會發生上述MS SQL Server的函式問題。 -->
- </selectKey>
- </insert>
通過以上方式,可以最大程度上確保插入資料的時候獲得當前自增主鍵。