`
no7beckham
  • 浏览: 94786 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ibatis selectkey

    博客分类:
  • JAVA
阅读更多
<!-- 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> 

<!-- 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的时候,从ibatis in action中看到的一段:

5.2.3  自动生成的主键

对于任何数据库来说,提供唯一标识数据表中一行记录的能力是至关重要的。几乎所有数据库都提供了为新添加的行自动生成主键的方法。这样再操作数据库的时候比较方便,但它也带来了一个问题,如果我们需要知道新生成的主键值该怎么办?

有的数据库供应商是预先生成(pre-generate)主键的(如Oracle和PostgreSQL),有的则是事后生成(post-generate)的(如SQL Server和MySQL)。不管是哪种方式,我们都可以使用<selectKey>节点来获取<insert>语句所产生的主键。

所以在MySQL的配置中
<selectKey resultClass="int" keyProperty="id" type="post">
多加了个post,结果初始化ibatis配置的时候就报错,不晓得是因为 ibatis in action书所用的ibatis版本太低还是怎么回事,反正去掉就没问题,哎,就先不关心了吧。
分享到:
评论
1 楼 gc715409742 2012-07-09  
如果主键是varchar类型呢?

相关推荐

Global site tag (gtag.js) - Google Analytics