ibatis selectkey

<!-- 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版本太低还是怎么回事,反正去掉就没问题,哎,就先不关心了吧。

你可能感兴趣的:(oracle,sql,mysql,ibatis,SQL Server)