iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post)。

Oracle设置

  1. <!-- Oracle SEQUENCE -->
  2. <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
  3. <selectKey resultClass="int" keyProperty="id" type="pre">
  4. <![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>
  5. </selectKey>
  6. <![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values(#id#,#description#)]]>
  7. </insert>

MS SQL Server配置

  1. <!-- Microsoft SQL Server IDENTITY Column -->
  2. <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
  3. <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#) ]]>
  4. <selectKey resultClass="int" keyProperty="id" type="post">
  5. <![CDATA[SELECT @@IDENTITY AS ID ]]>
  6. <!-- 该方法不安全 应当用SCOPE_IDENTITY() 但这个函数属于域函数,需要在一个语句块中执行。 -->
  7. </selectKey>
  8. </insert>

上述MS SQL Server配置随是官网提供的配置,但实际上却恰恰隐患重重!按下述配置,确保获得有效主键。

  1. <!-- Microsoft SQL Server IDENTITY Column 改进-->
  2. <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
  3. <selectKey resultClass="int" keyProperty="id">
  4. <![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values(#description#)
  5. SELECT SCOPE_IDENTITY() AS ID ]]>
  6. </selectKey>
  7. </insert>

MySQL配置

  1. <!-- MySQL Last Insert Id -->
  2. <insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
  3. <![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values(#description#)]]>
  4. <selectKey resultClass="int" keyProperty="id">
  5. <![CDATA[SELECT LAST_INSERT_ID() AS ID ]]>
  6. <!-- 该方法LAST_INSERT_ID()与数据库连接绑定,同属统一会话级别,不会发生上述MS SQL Server的函数问题。 -->
  7. </selectKey>
  8. </insert>

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

iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】的更多相关文章

  1. PowerDesigner中表名过长,自动生成的主键名截取的问题

    在PowerDesinger中,若表名过长,自动生成的主键名会被自动截取. 解决如下:DataBase/Edit Current DBMS/Scripts/Objects/PKey/ConstName ...

  2. (jdbc)取得数据库自动生成的主键方法

    一些类,在前面的博客中有,就不重复了 public class Test2 { TestDAO t=new TestDAO(); /*前提是数据表的主键是自动增加的, *取得数据库自动生成的主键 * ...

  3. JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理

    获取数据库自动生成的主键 [孤立的技术是没有价值的],我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. 具体的代码实现: /** * 获取数据 ...

  4. javaweb学习总结(三十七)——获得MySQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

  5. 【转】JDBC学习笔记(6)——获取自动生成的主键值&处理Blob&数据库事务处理

    转自:http://www.cnblogs.com/ysw-go/ 获取数据库自动生成的主键 我们这里只是为了了解具体的实现步骤:我们在插入数据的时候,经常会需要获取我们插入的这一行数据对应的主键值. ...

  6. javaweb(三十七)——获得MySQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

  7. Java_jdbc 基础笔记之十五 数据库连接(取得数据库自动生成的主键)

    public class testGetKeyValue { /** * 取得数据库自动生成的主键 */ @Test public void testGeneratedKeys() { Connect ...

  8. 五.获得MYSQL数据库自动生成的主键

    测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...

  9. JDBC 获取自动生成的主键

    为什么需要获取自动生成的主键 例如:

随机推荐

  1. C语言面向对象的简便方法

    都知道C语言是面向过程的,但是现在软件规模越来越大,通过面向对象的方式可以简化开发.业余时间想了个简单的方法,在C中使用一部分面向对象的基本功能.由于C语言自身的限制,并不完善,只能将就用,聊胜于无, ...

  2. DM8168 编译filesystem步骤

    在板子跑起来之前,需要先编译好8168的文件系统.前提是已经设置好板子的类型等参数,详见<DM8168环境搭建> 1.进入<DVR_RDK_BASE>/dvr_rdk目录 ma ...

  3. [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】

    题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...

  4. [原博客] POJ 2975 Nim 统计必胜走法个数

    题目链接题意介绍了一遍Nim取石子游戏,可以看上一篇文章详细介绍.问当前状态的必胜走法个数,也就是走到必败状态的方法数. 我们设sg为所有个数的Xor值.首先如果sg==0,它不可能有必胜走法,输出0 ...

  5. Stanford CoreNLP--功能列表

    Standford CoreNLP包含很多功能,github上有源码,github地址:Stanford CoreNLP,有需要的话可以下载看看. 主要内容在网站上都有描述,原文是这样写的: Choo ...

  6. DZ的伪静态神马的终于OK了

    十分感谢开发“凤凰图集”的onexin团队!帮忙搞定了伪静态!这玩意儿折腾了俺好多功夫,人家瞬间就搞定.

  7. Android 使用XmlPullParser解析xml

    这里我们假设要解析的xml文件名为:test.xml,我们将其放在assets路径中. xml文件内容为: <?xml version='1.0' encoding='utf-8' standa ...

  8. [OJ] Find Minimum in Rotated Sorted Array

    LintCode 159. Find Minimum in Rotated Sorted Array (Medium) LeetCode 153. Find Minimum in Rotated So ...

  9. openCV python 安装

    0, 用 import cv 测试,发现没有安装 opencv 模块. 首先先说本开发环境是在windows xp的环境下进行搭建的. 在搭建的过程中需要保证这三个条件: 1.python需要安装py ...

  10. usaco3.33Camelot(BFS)

    恶心的题啊 .. 先枚举哪个点是所有人集合的点 再枚举所有骑士遇见国王的点 如果全部枚举出来会大大的TLE 经大牛验证 只需要枚举国王周围的点就可以了+-2 之内 然后各种繁琐 各种错误 骑士有可能不 ...