Ibatis oracle中Sequences的使用方法
来源:互联网 发布:追风抢购软件 编辑:程序博客网 时间:2024/05/17 10:39
Ibatis oracle中Sequences的使用方法
Java代码
- <insert id="insertProduct-ORACLE" parameterClass="product">
- <selectKey resultClass="int" type="pre" keyProperty="id" >
- SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL
- </selectKey>
- insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)
- </insert>
和
- <insert id="insertProduct-ORACLE" parameterClass="product">
- insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (STOCKIDSEQUENCE.NEXTVAL,#description#)
- </insert>
第一种方法可以在java代码中通过product.getId()取得sequence的值,第二种方法不行
原帖:http://www.javaeye.com/topic/165857
关于selectKey
今天在用ibatis selectKey 生成 oracle sequence 的时候 发现一个问题。
其实就是相为SHIPMENT_HISTORY表加入一个主键sequence id shipmentHistoryId,加入一条记录,然后返回这个sequence id
- <insert id="abatorgenerated_insert" parameterClass="cn.hot.delivery.domain.ShipHistory">
- insert into SHIPMENT_HISTORY (SHIPMENT_ID, RECORD_CREATED_DATE, REMARK)
- values (#shipmentId:DECIMAL#, #recordCreatedDate:DATE#, #remark:VARCHAR#)
- <selectKey keyProperty="shipmentHistoryId" resultClass="java.math.BigDecimal">
- select SHIPMENT_HISTORY_ID_SEQUENCE.nextVal from dual
- <selectKey>
- <insert>
并且这段statement是由Abator自动生成的,蛮以为肯定不会出错的 。 但是这个 statement在运行的时候报错了 ,说不能插入 能null数值插入到SHIPMENT_HISTORY表中 ,说明这个selectKey就根本没有发挥出作用 。
查找了一下ibatis的中文文档 ,上面由下面的说明如下 :
很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。SQL Map通过<insert></insert>的子元素<selectkey></selectkey>来支持自动生成的键值。它同时支持预生成(如Oracle)和后生成两种类型(如MS-SQL Server)。下面是两个例子:
- < !—Oracle SEQUENCE Example -->
- <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
- <selectKey resultClass="int" keyProperty="id" >
- SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
- <selectKey>
- insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)
- values (#id#,#description#)
- <insert>
-
- <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
- insert into PRODUCT (PRD_DESCRIPTION)
- values (#description#)
- <selectKey resultClass="int" keyProperty="id" >
- SELECT @@IDENTITY AS ID
- <selectKey>
- <insert>
也就是说对于oracle来说,<selectKey> statement是必须前置的,并且 必须把sequence id放到insert into 句子中,就会没有问题的。按照上面的更改我自己的xml如下,果然没有问题了
- <insert id="abatorgenerated_insert" parameterClass="cn.hot.delivery.domain.ShipHistory">
- <selectKey keyProperty="shipmentHistoryId" resultClass="java.math.BigDecimal">
- select SHIPMENT_HISTORY_ID_SEQUENCE.nextVal as value from dual
- <selectKey>
- insert into SHIPMENT_HISTORY (SHIPMENT_HESTORY_ID,SHIPMENT_ID, RECORD_CREATED_DATE, REMARK) value(#shipmentHistoryId:DECIMAL#,#shipmentId:DECIMAL#, #recordCreatedDate:DATE#, #remark:VARCHAR#)
- <insert>
所以对于不同的数据库来说 。selectKey> 的用法可能是不一样的,网上的由很多资料的解释是根据不同的数据库的驱动,然后selectKey> 的用法也不一样。但是即使你用Abator来是生成,并且在Abator的配置文件中的
<jdbcconnection driverclass="oracle.jdbc.driver.OracleDriver"></jdbcconnection>
表示这个一个OracleDriver的驱动,但是Abator不会的根据不同的驱动然后生成不同的selectKey> 语句,所以说你如果用到oracle的时候,只能手工的改动这个statement了。
其实也可以用在insert语句中直接调用SEQUENCE.nextVal的方法来生成sequence id,例如
- <insert id="abatorgenerated_insert" parameterClass="cn.hot.delivery.domain.ShipHistory">
- insert into SHIPMENT_HISTORY (SHIPMENT_HISTORY_ID,SHIPMENT_ID,RECORD_CREATED_DATE, REMARK)
- Values
- (SHIPMENT_HISTORY_ID_SEQUENCE.nextVal,#shipmentId:DECIMAL#, #recordCreatedDate:DATE#, #remark:VARCHAR#)
- <insert>
这个statement是可以生成sequence并且插入记录的,唯一的缺点就是你不能同时通过
Object newKey = getSqlMapClientTemplate().insert(
"SHIPMENT_HISTORY.abatorgenerated_insert", record);
同时得到newKey这个sequence
总之,相对来说,selectKey>还是比较好用的,只要你注意你用的数据库的问题(再说,ibatis也没有屏蔽掉数据库之间的差异)
来源:http://www.javaeye.com/topic/120767
- Ibatis oracle中Sequences的使用方法
- Oracle中SEQUENCES的使用
- Oracle中SEQUENCES的使用
- ibatis中"in"的使用方法
- 学习Oracle中Sequences的使用
- 学习Oracle中Sequences的使用
- oracle的sequences用法
- iBATIS缓存的使用方法
- ibatis中SqlMapConfig的oracle数据库配置
- ibatis中mysql、oracle的区别
- ibatis中使用List作为传入参数的使用方法
- ibatIS学习笔记---Ibatis的基本使用方法
- Oracle中wm_concat()的使用方法
- MyEclipse中Oracle的使用方法
- Oracle中sequence的使用方法
- Oracle中sequence的使用方法
- Oracle中如何创建使用SEQUENCES
- Oracle中如何创建使用SEQUENCES(转)
- Linux内核模块编程
- 用户 'NT AUTHORITY/NETWORK SERVICE' 登录失败。
- php smarty模板中的条件判断
- 增大系统盘空间
- php smarty外部文件的载入
- Ibatis oracle中Sequences的使用方法
- 只需六步就可建立一个高效的管理团队
- 512汶川地震一周年大事记
- 第一次来到这个大家庭
- Rtos的调研分析报告
- php smarty外部文件的载入之二
- [双语阅读]研究:年轻胖男成婚几率低
- 初探Linux 2.6 内核--第一个内核模块
- php smarty的实际应用--多模版网站