论坛首页 Java版 iBATIS

iBatis自动生成的主键 (Oracle,Sql Server,Mysql)

浏览 832 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-07-18 关键字: ibatis
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成还是后生成。
<!-- 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> 

<!-- 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>

<!-- 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 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>


通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。
   
最后更新时间:2008-07-19
snowolf 写道
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成还是后生成。


<!-- 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>


通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。



mysql中不是可以用auto_increment吗?为什么要这样在ibatis中用?ms sql中也有identity可以用啊,干吗用这么麻烦的方法?如果是为了兼容其他数据库,还是可以考虑。
   
0 请登录后投票
最后更新时间:2008-07-20
tibetjungle 写道
snowolf 写道
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成还是后生成。


<!-- 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>


通过以上方式,可以最大程度上确保插入数据的时候获得当前自增主键。



mysql中不是可以用auto_increment吗?为什么要这样在ibatis中用?ms sql中也有identity可以用啊,干吗用这么麻烦的方法?如果是为了兼容其他数据库,还是可以考虑。

可能我没有说清楚,我要在插入表的时候获得的当前的主键,自增是有的。如果你要再插入动作的时候获得,一般都怎么做呢?
   
0 请登录后投票
最后更新时间:2008-07-23
单独写一个主键生成器啦。没有配置那么麻烦
   
0 请登录后投票
论坛首页 Java版 iBATIS

跳转论坛:
JavaEye推荐