1. 程式人生 > >獲取主鍵自動增長ID(Oracle/MSSQL/mysql),取得剛插入的ID編號

獲取主鍵自動增長ID(Oracle/MSSQL/mysql),取得剛插入的ID編號

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>

MS SQL Server配置

1<!-- Microsoft SQL Server IDENTITY Column -->2<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">3    <![CDATA[
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>
通過以上方式,可以最大程度上確保插入資料的時候獲得當前自增主鍵。