ibatis在sqlmap的配置文件中selectKey元素有个type属性,此属性可以指定:type="pre" Or type="post" 表示前生成还是后生成,对于不同的数据库主键自增长的方式也有所不同。
总结总结
oracle数据库:
<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>
DB2数据库:
<insert id="insertStatementConfig" parameterClass="java.util.HashMap">
INSERT INTO TBL_STATEMENT_CONFIG(
STATE_CONFIG_ID,
STATE_TYPE_ID,
STATE_DATE,
STATE_DATE_TYPE,
STATE_CURRENT_DATE,
TEMPLATE_ID
) VALUES(
nextval for SEQ_PI_ENUMTYPE_ID,(此处SEQ_PI_ENUMTYPE_ID是在dbv客户端数据库创建的sequence)
#stateTypeId#,
#stateDate#,
#stateDateType#
<isEmpty prepend="," property="stateCurrentDate" >
default
</isEmpty>
<isNotEmpty prepend="," property="stateCurrentDate">
#stateCurrentDate:TIMESTAMP#
</isNotEmpty>
,#tid#)
<selectKey keyProperty="stateConfigId" resultClass="java.lang.Long">
values prevval for SEQ_PI_ENUMTYPE_ID
</selectKey>
</insert>
MY SQL数据库:
<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>
MS SQL Server数据库:
<insert id="insertProduct-SQL-SERVER" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id">
<![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#)
SELECT SCOPE_IDENTITY() AS ID ]]>
</selectKey>
</insert>