文档章节

JDBC读取新插入Oracle数据库Sequence值的5种方法

司马马
 司马马
发布于 2015/10/15 23:41
字数 953
阅读 56
收藏 9
  1. /公共代码:得到数据库连接  

  2. public Connection getConnection() throws Exception{  

  3.     Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();  

  4.     Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1 :1521:dbname""username""password");  

  5.     return conn;  

  6. }  

  7.   

  8. //方法一  

  9. //先用select seq_t1.nextval as id from dual 取到新的sequence值。  

  10. //然后将最新的值通过变量传递给插入的语句:insert into t1(id) values(?)   

  11. //最后返回开始取到的sequence值。  

  12. //这种方法的优点代码简单直观,使用的人也最多,缺点是需要两次sql交互,性能不佳。  

  13. public int insertDataReturnKeyByGetNextVal() throws Exception {  

  14.     Connection conn = getConnection();  

  15.     String vsql = "select seq_t1.nextval as id from dual";  

  16.     PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql);  

  17.     ResultSet rs=pstmt.executeQuery();  

  18.     rs.next();  

  19.     int id=rs.getInt(1);  

  20.     rs.close();  

  21.     pstmt.close();  

  22.     vsql="insert into t1(id) values(?)";  

  23.     pstmt =(PreparedStatement)conn.prepareStatement(vsql);  

  24.     pstmt.setInt(1, id);  

  25.     pstmt.executeUpdate();  

  26.     System.out.print("id:"+id);  

  27.     return id;  

  28. }  

  29.   

  30. //方法二  

  31. //先用insert into t1(id) values(seq_t1.nextval)插入数据。  

  32. //然后使用select seq_t1.currval as id from dual返回刚才插入的记录生成的sequence值。  

  33. //注:seq_t1.currval表示取出当前会话的最后生成的sequence值,由于是用会话隔离,只要保证两个SQL使用同一个Connection即可,对于采用连接池应用需要将两个SQL放在同一个事务内才可保证并发安全。  

  34. //另外如果会话没有生成过sequence值,使用seq_t1.currval语法会报错。  

  35. //这种方法的优点可以在插入记录后返回sequence,适合于数据插入业务逻辑不好改造的业务代码,缺点是需要两次sql交互,性能不佳,并且容易产生并发安全问题。  

  36. public int insertDataReturnKeyByGetCurrVal() throws Exception {  

  37.     Connection conn = getConnection();  

  38.     String vsql = "insert into t1(id) values(seq_t1.nextval)";  

  39.     PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql);  

  40.     pstmt.executeUpdate();  

  41.     pstmt.close();  

  42.     vsql="select seq_t1.currval as id from dual";  

  43.     pstmt =(PreparedStatement)conn.prepareStatement(vsql);  

  44.     ResultSet rs=pstmt.executeQuery();  

  45.     rs.next();  

  46.     int id=rs.getInt(1);  

  47.     rs.close();  

  48.     pstmt.close();  

  49.     System.out.print("id:"+id);  

  50.     return id;  

  51. }  

  52.   

  53. //方法三  

  54. //采用pl/sql的returning into语法,可以用CallableStatement对象设置registerOutParameter取得输出变量的值。  

  55. //这种方法的优点是只要一次sql交互,性能较好,缺点是需要采用pl/sql语法,代码不直观,使用较少。  

  56. public int insertDataReturnKeyByPlsql() throws Exception {  

  57.     Connection conn = getConnection();  

  58.     String vsql = "begin insert into t1(id) values(seq_t1.nextval) returning id into :1;end;";  

  59.     CallableStatement cstmt =(CallableStatement)conn.prepareCall ( vsql);   

  60.     cstmt.registerOutParameter(1, Types.BIGINT);  

  61.     cstmt.execute();  

  62.     int id=cstmt.getInt(1);  

  63.     System.out.print("id:"+id);  

  64.     cstmt.close();  

  65.     return id;  

  66. }  

  67.   

  68. //方法四  

  69. //采用PreparedStatement的getGeneratedKeys方法  

  70. //conn.prepareStatement的第二个参数可以设置GeneratedKeys的字段名列表,变量类型是一个字符串数组  

  71. //注:对Oracle数据库这里不能像其它数据库那样用prepareStatement(vsql,Statement.RETURN_GENERATED_KEYS)方法,这种语法是用来取自增类型的数据。  

  72. //Oracle没有自增类型,全部采用的是sequence实现,如果传Statement.RETURN_GENERATED_KEYS则返回的是新插入记录的ROWID,并不是我们相要的sequence值。  

  73. //这种方法的优点是性能良好,只要一次sql交互,实际上内部也是将sql转换成oracle的returning into的语法,缺点是只有Oracle10g才支持,使用较少。  

  74. public int insertDataReturnKeyByGeneratedKeys() throws Exception {  

  75.     Connection conn = getConnection();  

  76.     String vsql = "insert into t1(id) values(seq_t1.nextval)";  

  77.     PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql,new String[]{"ID"});  

  78.     pstmt.executeUpdate();  

  79.     ResultSet rs=pstmt.getGeneratedKeys();  

  80.     rs.next();  

  81.     int id=rs.getInt(1);  

  82.     rs.close();  

  83.     pstmt.close();  

  84.     System.out.print("id:"+id);  

  85.     return id;  

  86. }  

  87.   

  88. //方法五  

  89. //和方法三类似,采用oracle特有的returning into语法,设置输出参数,但是不同的地方是采用OraclePreparedStatement对象,因为jdbc规范里标准的PreparedStatement对象是不能设置输出类型参数。  

  90. //最后用getReturnResultSet取到新插入的sequence值,  

  91. //这种方法的优点是性能最好,因为只要一次sql交互,oracle9i也支持,缺点是只能使用Oracle jdbc特有的OraclePreparedStatement对象。  

  92. public int insertDataReturnKeyByReturnInto() throws Exception {  

  93.     Connection conn = getConnection();  

  94.     String vsql = "insert into t1(id) values(seq_t1.nextval) returning id into :1";  

  95.     OraclePreparedStatement pstmt =(OraclePreparedStatement)conn.prepareStatement(vsql);  

  96.     pstmt.registerReturnParameter(1, Types.BIGINT);  

  97.     pstmt.executeUpdate();  

  98.     ResultSet rs=pstmt.getReturnResultSet();  

  99.     rs.next();  

  100.     int id=rs.getInt(1);  

  101.     rs.close();  

  102.     pstmt.close();  

  103.     System.out.print("id:"+id);  

  104.     return id;  

  105. }  

  1. SQL> create table T1  

  2.   2  (  

  3.   3    ID NUMBER  

  4.   4  );  

  5.    

  6. Table created  

  7. SQL> create sequence SEQ_T1;  

  8.    

  9. Sequence created  


本文转载自:http://blog.csdn.net/yzsind/article/details/6918506

司马马
粉丝 5
博文 25
码字总数 7151
作品 0
普陀
私信 提问
数据库在insert时,抛出“不支持的特性”异常

数据库为oracle 11g 经测试,发现在定义PreparedStatement 时,如果采用以下方式,会抛此异常. PreparedStatement stm = conn.prepareStatement(sql,Statement.RETURNGENERATEDKEYS); Prepa...

鱼中鱼
2012/07/18
1K
0
基于按annotation的hibernate主键生成策略

这里讨论代理主键,业务主键(比如说复合键等)这里不讨论。 一、JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@Generate...

_白开水_
2013/10/02
129
0
jdbc PreparedStatement 方式向Oracle批量插入数据怎么取Sequence的值?

jdbc PreparedStatement 方式向Oracle批量插入数据怎么取Sequence的值?代码如下: 这样提交了5条记录,数据库只有一条,可能是Sequence的值相同,数据覆盖了, 问题就是这种情况怎么取Seque...

大漠真人
2013/06/14
4.3K
4
基于AEAI ESB的处理大字段

1.背景 数据迁移中大字段一直是个比较头疼的问题,一旦大字段中值大于32K的话就无法用sql语句来实现插入和更新。通用的解决办法一般有两种:存储过程和JDBC。下面主要总结下基于AEAI ESB用J...

数通畅联
2015/01/22
182
0
Oracle的JDBC驱动的版本你了解吗?

classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle JDBC驱动来解决的?最常使用的ojdbc14.jar有多...

i33
2012/02/20
339
0

没有更多内容

加载失败,请刷新页面

加载更多

实战项目-学成在线(一)

之前看的黑马程序员实战项目之一,打算以博客的形式写出来,也让自己重新温习一下。 1、项目背景 略(就是当前这东西很火,我们重点在开发,这些就略过) 2、功能模块 门户,学习中心,教学管...

lianbang_W
38分钟前
4
0
基于Vue的数字输入框组件开发

本文转载于:专业的前端网站➫基于Vue的数字输入框组件开发 1、概述 Vue组件开发的API:props、events和slots 2、组件代码 github地址:https://github.com/MengFangui/VueInputNumber 效果:...

前端老手
46分钟前
4
0
百度地图根据经纬度获取运动轨迹

<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=n......

泉天下
48分钟前
5
0
学习记录(day04-axios增删改查、v-for循环、页面加载成功处理函数)

[TOC] 1.1 基本语法:插值表达式 <template> <div> {{username}} <br/> {{1+2+3}} <br/> {{'你的名字是:' + username}} <br/> {{'abc'.split('')}} </div><......

庭前云落
今天
5
0
CentOS Linux 7上将ISO映像文件写成可启动U盘

如今,电脑基本上都支持U盘启动,所以,可以将ISO文件写到U盘上,用来启动并安装操作系统。 我想将一个CentOS Linux 7的ISO映像文件写到U盘上,在CentOS Linux 7操作系统上,执行如下命令: ...

大别阿郎
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部