技术前提:我们使用iBatis作为持久层方案

技术场景: 
    假设我们有两张表,一张主表Main,一张子表Sub,并且主表的主键是由数据库维护的自增长的主键,子表中有一个字段引用这个主键,那么当我们插入主表数据后,就需要马上返回这个自增长的主键。

解决方案: 
    可以在insert时通过iBatis的selectKey返回那个主键。 
    selectKey有3个主要的属性: 
    1)resultClass:返回的主键的数据类型,跟sqlMap中的数据类型一致; 
    2)type:表示主键在insert之前或之后生成(取决于数据库的主键生成策略),取值分别为[pre|post],非必须,未填写时如果在insert之前表示pre,否则表示post; 
    2)keyProperty:返回值保存到的属性,非必须(作用参见Oracle配置);

实际配置: 
<!-- 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#) 
<!-- 此处体现了keyProperty的作用 -->  
    ]]>    
</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>  
上述MS SQL Server配置随是官网提供的配置,但实际上却恰恰隐患重重!按下述配置,确保获得有效主键。

<!-- Microsoft SQL Server IDENTITY Column improvement-->    
<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">  
    insert into PRODUCT(PRD_DESCRIPTION) values(#description#)    
    <selectKey resultClass="int" keyProperty="id">  
        SELECT LAST_INSERT_ID() AS ID 
    </selectKey>  
</insert> 
<!-- 该方法LAST_INSERT_ID()与数据库连接绑定,同属统一会话级别,不会发生上述MS SQL Server的函数问题。 -->

<!-- DB2 Identity Val Local -->  
<insert id="insertProduct-DB2" parameterClass="com.domain.Product"> 
    insert into PRODUCT(PRD_DESCRIPTION) values(#description#) 
    <selectKey resultClass="int" type="post"> 
        VALUES IDENTITY_VAL_LOCAL() 
    </selectKey> 
</insert>

<!-- Sqlite sqlite_sequence -->  
<insert id="insertProduct-Sqlite" parameterClass="com.domain.Product"> 
    insert into PRODUCT(PRD_DESCRIPTION) values(#description#) 
    <selectKey resultClass="string" type="post"> 
        SELECT seq FROM sqlite_sequence WHERE name = 'PRD_DESCRIPTION' 
    </selectKey> 
</insert> 
<!-- 主键字段一定要加下INTEGER PRIMARY KEY AUTOINCREMENT,否则会报找不到 sqlite_sequence 表。 -->

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

关于iBatis-selectKey的一点笔记的更多相关文章

  1. 关于最小生成树,拓扑排序、强连通分量、割点、2-SAT的一点笔记

    关于最小生成树,拓扑排序.强连通分量.割点.2-SAT的一点笔记 前言:近期在复习这些东西,就xjb写一点吧.当然以前也写过,但这次偏重不太一样 MST 最小瓶颈路:u到v最大权值最小的路径.在最小生 ...

  2. [转&精]IO_STACK_LOCATION与IRP的一点笔记

    IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料. 1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT ...

  3. 关于SS的一点笔记

    过年的时候抽了点时间了解了下ss的协议.整理了一点笔记,一直没有时间发.今天发一下,免得忘了. SS的结构本身比较简单,他的基本结构如下: ss通常分为client和server两部分 client是 ...

  4. ibatis selectKey

    <insert id="insert" parameterClass="A"> <selectKey keyProperty="uu ...

  5. ibatis selectKey用法问题

    其实就是相为SHIPMENT_HISTORY表加入一个主键sequence id shipmentHistoryId,加入一条记录,然后返回这个sequence id xml 代码 <inser ...

  6. pyhon的yileld的一点笔记

    yield感觉很神秘,感觉也不好理解,学习pyhon最后终归是要学习这个东西,研究了一段时间,把自己的笔记写下来 说简单点就是遇到yield就停止往下执行代码,也包括不执行yield这条语句,然后返回 ...

  7. 关于在VB.NET中调用使用VC++编写的类库dll的一点笔记

    前言 结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路.然而在实现过程中却遇到了很多的问题. 我在这个过程中是负责使用vb.net编写UI并调 ...

  8. 阅读xtrabackup代码的一点笔记

    xtrabackup binary最重要的两个过程是backup和prepare,对应的函数分别是xtrabackup_backup_func()和xtrabackup_prepare_func(), ...

  9. c#委托----我的一点笔记

    public partial class ucBloodLabs { public delegate void ShowBloodEvent(); public ShowBloodEvent Show ...

随机推荐

  1. Jlink 软件断点和硬件断点

    调试2440 RAM拷贝至SDRAM遇到的问题 汇编代码主要是初始化一些寄存器,关狗,初始化时钟,初始化存储管理器以便访问内存,然后将SoC上4k RAM数据拷贝至SDRAM,然后在SRAM里面运行, ...

  2. Linux之JDK在线安装及配置

    1.查找java相关得列表  yum -y list java*2.在线安装 yum -y install java-1.6.0-openjdk*3.查看安装目录  ls -l /usr/lib/jv ...

  3. 利用vue-cli搭建项目后的目录结构

    npm install -g vue-cli vue init webpack my-project(项目名称)  后的目录结构: -----build         webpack配置相关 --- ...

  4. zTree基本功能[core]

    zTree 是一个依靠jQuery实现的多功能"树插件".优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. zTree v3.0 将核心代码按照功能进行了分割,不需 ...

  5. null?对象?异常?到底应该如何返回错误信息

    这篇文章记录我的一些思考.在工作了一段时间之后. 问题的核心很简单:到底如何返回错误信息. 学生时代,见到过当时的老师的代码: if (foo() == null) { } 当然,这位老师是一位比较擅 ...

  6. 桥接物理网卡,pipwork指定ip,外网连接,研究salt+docker

    1.桥接物理网卡: 首先下载工具: yum -y install --enablerepo=epel bridge-utils 停止服务: 983 systemctl stop docker 删除do ...

  7. MyEclipse快捷键大全(转)1

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+ ...

  8. java三

    1,深复制与浅复制 浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. 深复制:被复制对象 ...

  9. 【UVALive4685-Succession】树形DP

    http://acm.hust.edu.cn/vjudge/problem/14338 题意:给定一棵树,每个点有一个值,让你选择k个点,并且这k个点是连在一起的(从任意一个点出发,可以遍历完所有选择 ...

  10. 【uva11468-Substring】AC自动机+dp

    http://acm.hust.edu.cn/vjudge/problem/31655 题意:给定k个模板串,n个字符以及选择它的概率pro[i],要构造一个长度问L的字符串s,问s不包含任意一个模板 ...