獲取主鍵自動增長ID(Oracle/MSSQL/mysql),取得剛插入的ID編號
阿新 • • 發佈:2019-02-07
iBatis的SQLMap配置檔案的selectKey元素有個type屬性,可以指定pre或者post表示前生成(pre)還是後生成(post)。
Oracle設定
1<!-- Oracle SEQUENCE -->2<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">3 <selectKey resultClass="int" keyProperty="id" type="pre">4 <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL ]]>5 </selectKey>6 <![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values(#id#,#description#)]]>7</insert>
insert into PRODUCT (PRD_DESCRIPTION) values(#description#) ]]>4 <selectKey resultClass="int" keyProperty="id" type="post">5 <![CDATA[SELECT @@IDENTITY AS ID ]]>6 <!-- 該方法不安全 應當用SCOPE_IDENTITY() 但這個函式屬於域函式,需要在一個語句塊中執行。 -->7 </selectKey>8</insert>
上述MS SQL Server配置隨是官網提供的配置,但實際上卻恰恰隱患重重!按下述配置,確保獲得有效主鍵。
1<!-- Microsoft SQL Server IDENTITY Column 改進-->2<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">3 <selectKey resultClass="int" keyProperty="id">4 <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#)
5 SELECT SCOPE_IDENTITY() AS ID ]]>6 </selectKey>7</insert>
mysql配置
1<!-- MySQL Last Insert Id -->2<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">3 <![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values(#description#)]]>4 <selectKey resultClass="int" keyProperty="id">5 <![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>6 <!-- 該方法LAST_INSERT_ID()與資料庫連線繫結,同屬統一會話級別,不會發生上述MS SQL Server的函式問題。 -->7 </selectKey>8</insert>
通過以上方式,可以最大程度上確保插入資料的時候獲得當前自增主鍵。
Oracle設定
1<!-- Oracle SEQUENCE -->2<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">3 <selectKey resultClass="int" keyProperty="id" type="pre">4 <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
MS SQL Server配置
1<!-- Microsoft SQL Server IDENTITY Column -->2<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">3 <![CDATA[上述MS SQL
1<!-- Microsoft SQL Server IDENTITY Column 改進-->2<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">3 <selectKey resultClass="int" keyProperty="id">4 <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#)
5 SELECT SCOPE_IDENTITY() AS ID ]]>6 </selectKey>7</insert>
mysql配置
1<!-- MySQL Last Insert Id -->2<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">3 <![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values(#description#)]]>4 <selectKey resultClass="int" keyProperty="id">5 <![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>6 <!-- 該方法LAST_INSERT_ID()與資料庫連線繫結,同屬統一會話級別,不會發生上述MS SQL Server的函式問題。 -->7 </selectKey>8</insert>
通過以上方式,可以最大程度上確保插入資料的時候獲得當前自增主鍵。