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

xml 代码
  1. <insert id="abatorgenerated_insert" parameterClass="cn.hot.delivery.domain.ShipHistory">
  2. insert into SHIPMENT_HISTORY (SHIPMENT_ID, RECORD_CREATED_DATE, REMARK)
  3. values (#shipmentId:DECIMAL#,  #recordCreatedDate:DATE#, #remark:VARCHAR#)
  4. <selectKey keyProperty="shipmentHistoryId" resultClass="java.math.BigDecimal">
  5. select SHIPMENT_HISTORY_ID_SEQUENCE.nextVal from dual
  6. <<!---->selectKey>
  7. <<!---->insert>

并且这段statement是由Abator自动生成的,蛮以为肯定不会出错的 。  但是这个 statement在运行的时候报错了 ,说不能插入 能null数值插入到SHIPMENT_HISTORY表中 ,说明这个selectKey就根本没有发挥出作用 。

查找了一下ibatis的中文文档 ,上面由下面的说明如下 :

很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。SQL Map通过<insert></insert>的子元素<selectkey></selectkey>来支持自动生成的键值。它同时支持预生成(如Oracle)和后生成两种类型(如MS-SQL Server)。下面是两个例子:

xml 代码
  1. < !—Oracle SEQUENCE Example -->
  2. <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
  3. <selectKey resultClass="int" keyProperty="id" >
  4. SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
  5. <!----><selectKey>
  6. insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)
  7. values (#id#,#description#)
  8. <insert>
  9. <!---->
  10. <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
  11. insert into PRODUCT (PRD_DESCRIPTION)
  12. values (#description#)
  13. <selectKey resultClass="int" keyProperty="id" >
  14. SELECT @@IDENTITY AS ID
  15. <<!---->selectKey>
  16. <insert>

也就是说对于oracle来说,<selectKey>   statement是必须前置的,并且 必须把sequence id放到insert into 句子中,就会没有问题的。按照上面的更改我自己的xml如下,果然没有问题了

xml 代码
  1. <insert id="abatorgenerated_insert" parameterClass="cn.hot.delivery.domain.ShipHistory">
  2. <selectKey keyProperty="shipmentHistoryId" resultClass="java.math.BigDecimal">
  3. select SHIPMENT_HISTORY_ID_SEQUENCE.nextVal as value  from dual
  4. <!----><selectKey>
  5. insert into SHIPMENT_HISTORY (SHIPMENT_HESTORY_ID,SHIPMENT_ID, RECORD_CREATED_DATE, REMARK)      value(#shipmentHistoryId:DECIMAL#,#shipmentId:DECIMAL#, #recordCreatedDate:DATE#, #remark:VARCHAR#)
  6. <insert>

所以对于不同的数据库来说 。<!---->selectKey>   的用法可能是不一样的,网上的由很多资料的解释是根据不同的数据库的驱动,然后<!---->selectKey>   的用法也不一样。但是即使你用Abator来是生成,并且在Abator的配置文件中的

<jdbcconnection driverclass="oracle.jdbc.driver.OracleDriver"></jdbcconnection>

表示这个一个OracleDriver的驱动,但是Abator不会的根据不同的驱动然后生成不同的<!---->selectKey> 语句,所以说你如果用到oracle的时候,只能手工的改动这个statement了。

其实也可以用在insert语句中直接调用SEQUENCE.nextVal的方法来生成sequence id,例如

xml 代码
  1. <insert id="abatorgenerated_insert" parameterClass="cn.hot.delivery.domain.ShipHistory">  
  2. insert into SHIPMENT_HISTORY (SHIPMENT_HISTORY_ID,SHIPMENT_ID,RECORD_CREATED_DATE, REMARK)  
  3. Values  
  4. (SHIPMENT_HISTORY_ID_SEQUENCE.nextVal,#shipmentId:DECIMAL#, #recordCreatedDate:DATE#, #remark:VARCHAR#)  
  5. <insert>  


这个statement是可以生成sequence并且插入记录的,唯一的缺点就是你不能同时通过

Object newKey = getSqlMapClientTemplate().insert(
"SHIPMENT_HISTORY.abatorgenerated_insert", record);

同时得到newKey这个sequence

总之,相对来说,<!---->selectKey>还是比较好用的,只要你注意你用的数据库的问题(再说,ibatis也没有屏蔽掉数据库之间的差异)

ibatis selectKey用法问题的更多相关文章

  1. ibatis selectKey

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

  2. Mybatis resultMap空值映射问题解决

    Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 name,sex,age,数据库中的 ...

  3. 解决mybatis空字段null字段不返回

    Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 name,sex,age,数据库中的 ...

  4. Java回顾之ORM框架

    这篇文章里,我们主要讨论ORM框架,以及在使用上和JDBC的区别. 概述 ORM框架不是一个新话题,它已经流传了很多年.它的优点在于提供了概念性的.易于理解的数据模型,将数据库中的表和内存中的对象建立 ...

  5. iBatis一些非见用法(相当实用)

     兼顾效率,iBatis一些非见用法(10条) 2009-09-18 10:33:03 标签:iBatis 休闲 职场 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声 ...

  6. ibatis的selectkey

    在使用ibatis插入数据进数据库的时候,会用到一些sequence的数据,有些情况下,在插入完成之后还需要将sequence的值返回,然后才能进行下一步的操作.       使用ibatis的sel ...

  7. iBatis第三章:iBatis的基本用法

    iBatis 在DAO层的用法很基础,和一般 JDBC 用法没太多的不同之处,主要是实现数据的持久化.它的优势是用法比较灵活,可以根据业务需要,写出适应需要的sql,其使用简单,只要会使用sql,就能 ...

  8. iBATIS typeHandler selectKey

    typeHandler 是针对把数据库里面的某列的数据类型转换的应用程序中的数据类型,简单的说就是把 type=>dbType  反之把dbType=>type. 例如数据库某列的内容是l ...

  9. ibatis配置xml文件中CDATA的用法

    ibatis作为一种半自动化的OR Mapping工具,其灵活性日益体现出来,越来越多的人都倾向于在项目中使用.由于Sql中经常有与xml规范相冲突的字符对xml映射文件的合法性造成影响.许多人都知道 ...

随机推荐

  1. dipole antenna simulation by HFSS

    工作频点为1GHz,新建工程,添加新设计,编辑添加下面的变量 建立天线模型,即两个金属圆柱.编辑完一个振子后,另一半可以用镜像命令产生参数如下设置 ,材料为PEC 两个圆柱间建立一个矩形片,连接两个圆 ...

  2. selenium如何操作cookies实现免登录

    执行接口测试或者某些自动化测试时,为了避免每次访问接口都需要登录操作,可以用访问接口时,把cookies信息传过去. 思路是先登录一次页面,获取到cookies信息,把cookies信息保存到本地文件 ...

  3. jquery/js实现验证聚焦,失焦

    jquery实现验证聚焦,失焦方法: 我还是喜欢用jquery来实现,不管页面中多少个输入框需要实现聚焦,失焦,都公有,我常用的方法是: 遍历该页面中的input框,获取输入框中的val值,当该输入框 ...

  4. leetcode: Path Sum II 迭代法

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  5. 第16章 Windows线程栈

    16.1 线程栈及工作原理 (1)线程栈简介 ①系统在创建线程时,会为线程预订一块地址空间(即每个线程私有的栈空间),并调拨一些物理存储器.默认情况下,预订1MB的地址空间并调拨两个页面的存储器. ② ...

  6. 用Access作为后台数据库支撑,书写一个用C#写入记录的案例

    具体的步骤: 1.创建并打开一个OleDbConnection对象 2.创建插入的SQL语句 3.创建一个OleDbCommand对象 4.使用OleDbCommand对象来插入数据 5.关闭OleD ...

  7. 2D Skeletal Animation Ready

    骨骼动画 Cool 昨天研究了一天的2D骨骼动画,自己动手做了骨骼动画,感觉比用序列帧做动画方便多了,非常Cool ! 刚开始做骨骼动画用的是一整张图,做动画时在分配完权重之后,拉伸顶点上连接着的其它 ...

  8. [转]在Eclipse中使用JUnit4进行单元测试(高级篇)

    通过前2篇文章,您一定对JUnit有了一个基本的了解,下面我们来探讨一下JUnit4中一些高级特性. 一.高级Fixture 上一篇文章中我们介绍了两个Fixture标注,分别是@Before和@Af ...

  9. Linux命令学习-date

    date命令可以用来显示和修改系统日期时间,注意不是time命令. 1.在命令行输入date显示当前时间 [root@vm4 logs]# dateSat Nov 22 00:00:02 CST 20 ...

  10. 狮子和计算Java题

    package cn.bdqn.com; import java.util.Scanner; public class Jisaunqi { int num1; int num2; int jiegu ...