http://morning2008.iteye.com/blog/611528
iBatis的sqlMap配置文件的selectKey 元素有個type 屬性,可以指定pre 或者post 表示前生成(pre )還是后生成(post )。 Oracle設置?
??
Xml代碼 ?
? ?? < 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 > ???
<!-- 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配置
?
Xml代碼 ?
? ?? < 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?]]> ?? ?????????? ????</ selectKey > ? ?? </ insert > ??
<!-- 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配置隨是官網提供的配置,但實際上卻恰恰隱患重重!按下述配置,確保獲得有效主鍵。?
?
Xml代碼 ?
? ?? < 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 > ??
<!-- 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配置
?
Xml代碼 ?
?? < 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?]]> ? ?? ?????????? ????</ selectKey > ?? </ insert > ??
<!-- 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>
通過以上方式,可以最大程度上確保插入數據的時候獲得當前自增主鍵。?
總結
以上是生活随笔 為你收集整理的ibatis中主键自动增长(Oracle,Ms sql server ,mysql) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。