ibatis selectKey用法问题

其实就是相为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也没有屏蔽掉数据库之间的差异)

时间: 2024-11-08 22:06:57

ibatis selectKey用法问题的相关文章

ibatis selectKey用法注意事项

在我们使用插入数据库时,大部门ID是自增长的,需要返回ID,然后再插入相关的关系表中.但是有时候同样也会抛出问题,比如以下场景: 开始使用int做为ID自增长,返回相关的主键值,但是后来改动,改为String类型,使用UUID赋值,但是在ibatis时,依然保留如下的配置:   <insert id="insertInternet" parameterClass="dmGroupDO" >     INSERT INTO dm_group(id,name

ibatis selectKey

<insert id="insert" parameterClass="A"> <selectKey keyProperty="uuid" type="pre"> select seq_sample.nextval from dual </selectKey> <![CDATA[ insert into tbl_sample(uuid,name) values (#uuid#,#nam

Mybatis的搭建与使用

Hibernate是非常完美的一个持久性框架,但是由于其考虑到各种功能和通用性,导致这个框架太大了,另外就是封装的太好了导致自主性比较小.所以Mybatis受到很多公司的欢迎.Mybatis以前叫做ibatis,用法稍微有点区别,在这里我用的是Mybatis 3 1.去官网下载Mybatis的Jar包 http://mybatis.github.io/ 2.配置SqlMapConfig.xml文件 <?xml version="1.0" encoding="UTF-8&

iBatis动态SQL标签用法

1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 -->         <sql id="sql_count">                 select count(*)         </sql>         <sql id="sql_select">                 select *         </sql>         <sql i

Ibatis collect select用法详解

问题:之前接触过Ibatis的使用,在做一对多的时候,一般都是手动去填充,非自动让ibatis去填充数据. 下面就用ibatis的自动填充功能来实现. 关键使用到collection 标签下的select标签. 现在有活动表,讨论表 一个活动对应多条讨论,一条讨论属于一个活动 其中活动表中的activityId与讨论表中的activityId对应,怎么用ibatis查询一条活动的时候,同时将讨论表的数据装进domain中 ActivitysWithBLOBs.java 1 privateInte

ibatis resultMap 的用法

先看个具体的例子: 1 <resultMap id=”get-product-result” class=”com.ibatis.example.Product”> 2 <result property=”id” column=”PRD_ID”/> 3 <result property=”description” column=”PRD_DESCRIPTION”/> 4 </resultMap> 5 <statement id=”getProduct”

iBATIS sql文件里面特殊用法

ibatis中iterate的用法(conjunction=&quot;or&quot; &quot;,&quot;)

例子一 查询条件dto public class queryCondition{ private String[] stuIds; private String name;} 查询sqlMap <select id="selectStu" parameterClass="cn.xy.queryCondition" resultClass="cn.xy.Student"> select id,name from student <

iBATIS开发指南笔记

第一部分  概述 (一)目标和初衷 1. iBATIS的目标是:用少量的代码获得大量的数据访问功能 2. 初衷是让程序员将如下过程做的更好更简单: Separating SQL code from programming code 将SQL代码从程序代码中分离 Passing input parameters to the library classes and extracting the output 对类库传递输入参数来提取输出结果 Separating data access class