ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:16.94KB ,
资源ID:3457558      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3457558.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(JDBC读取新插入Oracle数据库Sequence值的5种方法.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、JDBC读取新插入Oracle数据库Sequence值的5种方法JDBC读取新插入Oracle数据库Sequence值的5种方法 JDBC读取新插入Oracle数据库Sequence值的5种方法 Oracle的sequence实现非常灵活,所以也带来一些易用性问题,如何取到新插入记录生成的sequence值与其它数据库有较大差别,本文详国介绍了5种实现读取新插入记录sequence值的方法。测试用的数据库脚本:view plaincopy to clipboardprint?SQL> create table T1 2 ( 3 ID NUMBER 4 ); Table created S

2、QL> create sequence SEQ_T1; Sequence created SQL> create table T1 2 ( 3 ID NUMBER 4 ); Table createdSQL> create sequence SEQ_T1; Sequence createdview plaincopy to clipboardprint?/公共代码:得到数据库连接 public Connection getConnection() throws Exception Class.forName(oracle.jdbc.driver.OracleDriver).n

3、ewInstance(); Connection conn = DriverManager.getConnection(jdbc:oracle:thin:127.0.0.1:1521:dbname, username, password); return conn; /方法一 /先用select seq_t1.nextval as id from dual 取到新的sequence值。 /然后将最新的值通过变量传递给插入的语句:insert into t1(id) values(?) /最后返回开始取到的sequence值。 /这种方法的优点代码简单直观,使用的人也最多,缺点是需要两次sql交

4、互,性能不佳。 public int insertDataReturnKeyByGetNextVal() throws Exception Connection conn = getConnection(); String vsql = select seq_t1.nextval as id from dual; PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql); ResultSet rs=pstmt.executeQuery(); rs.next(); int id=rs.getInt(1); rs

5、.close(); pstmt.close(); vsql=insert into t1(id) values(?); pstmt =(PreparedStatement)conn.prepareStatement(vsql); pstmt.setInt(1, id); pstmt.executeUpdate(); System.out.print(id:+id); return id; /方法二 /先用insert into t1(id) values(seq_t1.nextval)插入数据。 /然后使用select seq_t1.currval as id from dual返回刚才插入的

6、记录生成的sequence值。 /注:seq_t1.currval表示取出当前会话的最后生成的sequence值,由于是用会话隔离,只要保证两个SQL使用同一个Connection即可,对于采用连接池应用需要将两个SQL放在同一个事务内才可保证并发安全。 /另外如果会话没有生成过sequence值,使用seq_t1.currval语法会报错。 /这种方法的优点可以在插入记录后返回sequence,适合于数据插入业务逻辑不好改造的业务代码,缺点是需要两次sql交互,性能不佳,并且容易产生并发安全问题。 public int insertDataReturnKeyByGetCurrVal() th

7、rows Exception Connection conn = getConnection(); String vsql = insert into t1(id) values(seq_t1.nextval); PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql); pstmt.executeUpdate(); pstmt.close(); vsql=select seq_t1.currval as id from dual; pstmt =(PreparedStatement)conn.prepare

8、Statement(vsql); ResultSet rs=pstmt.executeQuery(); rs.next(); int id=rs.getInt(1); rs.close(); pstmt.close(); System.out.print(id:+id); return id; /方法三 /采用pl/sql的returning into语法,可以用CallableStatement对象设置registerOutParameter取得输出变量的值。 /这种方法的优点是只要一次sql交互,性能较好,缺点是需要采用pl/sql语法,代码不直观,使用较少。 public int ins

9、ertDataReturnKeyByPlsql() throws Exception Connection conn = getConnection(); String vsql = begin insert into t1(id) values(seq_t1.nextval) returning id into :1;end; CallableStatement cstmt =(CallableStatement)conn.prepareCall ( vsql); cstmt.registerOutParameter(1, Types.BIGINT); cstmt.execute(); in

10、t id=cstmt.getInt(1); System.out.print(id:+id); cstmt.close(); return id; /方法四 /采用PreparedStatement的getGeneratedKeys方法 /conn.prepareStatement的第二个参数可以设置GeneratedKeys的字段名列表,变量类型是一个字符串数组 /注:对Oracle数据库这里不能像其它数据库那样用prepareStatement(vsql,Statement.RETURN_GENERATED_KEYS)方法,这种语法是用来取自增类型的数据。 /Oracle没有自增类型,全部

11、采用的是sequence实现,如果传Statement.RETURN_GENERATED_KEYS则返回的是新插入记录的ROWID,并不是我们相要的sequence值。 /这种方法的优点是性能良好,只要一次sql交互,实际上内部也是将sql转换成oracle的returning into的语法,缺点是只有Oracle10g才支持,使用较少。 public int insertDataReturnKeyByGeneratedKeys() throws Exception Connection conn = getConnection(); String vsql = insert into t1

12、(id) values(seq_t1.nextval); PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql,new StringID); pstmt.executeUpdate(); ResultSet rs=pstmt.getGeneratedKeys(); rs.next(); int id=rs.getInt(1); rs.close(); pstmt.close(); System.out.print(id:+id); return id; /方法五 /和方法三类似,采用oracle特有的ret

13、urning into语法,设置输出参数,但是不同的地方是采用OraclePreparedStatement对象,因为jdbc规范里标准的PreparedStatement对象是不能设置输出类型参数。 /最后用getReturnResultSet取到新插入的sequence值, /这种方法的优点是性能最好,因为只要一次sql交互,oracle9i也支持,缺点是只能使用Oracle jdbc特有的OraclePreparedStatement对象。 public int insertDataReturnKeyByReturnInto() throws Exception Connection c

14、onn = getConnection(); String vsql = insert into t1(id) values(seq_t1.nextval) returning id into :1; OraclePreparedStatement pstmt =(OraclePreparedStatement)conn.prepareStatement(vsql); pstmt.registerReturnParameter(1, Types.BIGINT); pstmt.executeUpdate(); ResultSet rs=pstmt.getReturnResultSet(); rs

15、.next(); int id=rs.getInt(1); rs.close(); pstmt.close(); System.out.print(id:+id); return id; /公共代码:得到数据库连接public Connection getConnection() throws Exception Class.forName(oracle.jdbc.driver.OracleDriver).newInstance(); Connection conn = DriverManager.getConnection(jdbc:oracle:thin:127.0.0.1:1521:db

16、name, username, password); return conn;/方法一/先用select seq_t1.nextval as id from dual 取到新的sequence值。/然后将最新的值通过变量传递给插入的语句:insert into t1(id) values(?) /最后返回开始取到的sequence值。/这种方法的优点代码简单直观,使用的人也最多,缺点是需要两次sql交互,性能不佳。public int insertDataReturnKeyByGetNextVal() throws Exception Connection conn = getConnecti

17、on(); String vsql = select seq_t1.nextval as id from dual; PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql); ResultSet rs=pstmt.executeQuery(); rs.next(); int id=rs.getInt(1); rs.close(); pstmt.close(); vsql=insert into t1(id) values(?); pstmt =(PreparedStatement)conn.prepareS

18、tatement(vsql); pstmt.setInt(1, id); pstmt.executeUpdate(); System.out.print(id:+id); return id;/方法二/先用insert into t1(id) values(seq_t1.nextval)插入数据。/然后使用select seq_t1.currval as id from dual返回刚才插入的记录生成的sequence值。/注:seq_t1.currval表示取出当前会话的最后生成的sequence值,由于是用会话隔离,只要保证两个SQL使用同一个Connection即可,对于采用连接池应用需

19、要将两个SQL放在同一个事务内才可保证并发安全。/另外如果会话没有生成过sequence值,使用seq_t1.currval语法会报错。/这种方法的优点可以在插入记录后返回sequence,适合于数据插入业务逻辑不好改造的业务代码,缺点是需要两次sql交互,性能不佳,并且容易产生并发安全问题。public int insertDataReturnKeyByGetCurrVal() throws Exception Connection conn = getConnection(); String vsql = insert into t1(id) values(seq_t1.nextval);

20、 PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql); pstmt.executeUpdate(); pstmt.close(); vsql=select seq_t1.currval as id from dual; pstmt =(PreparedStatement)conn.prepareStatement(vsql); ResultSet rs=pstmt.executeQuery(); rs.next(); int id=rs.getInt(1); rs.close(); pstmt.clos

21、e(); System.out.print(id:+id); return id;/方法三/采用pl/sql的returning into语法,可以用CallableStatement对象设置registerOutParameter取得输出变量的值。/这种方法的优点是只要一次sql交互,性能较好,缺点是需要采用pl/sql语法,代码不直观,使用较少。public int insertDataReturnKeyByPlsql() throws Exception Connection conn = getConnection(); String vsql = begin insert into

22、t1(id) values(seq_t1.nextval) returning id into :1;end; CallableStatement cstmt =(CallableStatement)conn.prepareCall ( vsql); cstmt.registerOutParameter(1, Types.BIGINT); cstmt.execute(); int id=cstmt.getInt(1); System.out.print(id:+id); cstmt.close(); return id;/方法四/采用PreparedStatement的getGenerated

23、Keys方法/conn.prepareStatement的第二个参数可以设置GeneratedKeys的字段名列表,变量类型是一个字符串数组/注:对Oracle数据库这里不能像其它数据库那样用prepareStatement(vsql,Statement.RETURN_GENERATED_KEYS)方法,这种语法是用来取自增类型的数据。/Oracle没有自增类型,全部采用的是sequence实现,如果传Statement.RETURN_GENERATED_KEYS则返回的是新插入记录的ROWID,并不是我们相要的sequence值。/这种方法的优点是性能良好,只要一次sql交互,实际上内部也是

24、将sql转换成oracle的returning into的语法,缺点是只有Oracle10g才支持,使用较少。public int insertDataReturnKeyByGeneratedKeys() throws Exception Connection conn = getConnection(); String vsql = insert into t1(id) values(seq_t1.nextval); PreparedStatement pstmt =(PreparedStatement)conn.prepareStatement(vsql,new StringID); ps

25、tmt.executeUpdate(); ResultSet rs=pstmt.getGeneratedKeys(); rs.next(); int id=rs.getInt(1); rs.close(); pstmt.close(); System.out.print(id:+id); return id;/方法五/和方法三类似,采用oracle特有的returning into语法,设置输出参数,但是不同的地方是采用OraclePreparedStatement对象,因为jdbc规范里标准的PreparedStatement对象是不能设置输出类型参数。/最后用getReturnResult

26、Set取到新插入的sequence值,/这种方法的优点是性能最好,因为只要一次sql交互,oracle9i也支持,缺点是只能使用Oracle jdbc特有的OraclePreparedStatement对象。public int insertDataReturnKeyByReturnInto() throws Exception Connection conn = getConnection(); String vsql = insert into t1(id) values(seq_t1.nextval) returning id into :1; OraclePreparedStateme

27、nt pstmt =(OraclePreparedStatement)conn.prepareStatement(vsql); pstmt.registerReturnParameter(1, Types.BIGINT); pstmt.executeUpdate(); ResultSet rs=pstmt.getReturnResultSet(); rs.next(); int id=rs.getInt(1); rs.close(); pstmt.close(); System.out.print(id:+id); return id; 以上5种方法都可以实现功能,以下是5种方法的优缺点汇总,

28、个人推荐性能要求一般的业务采用第一种方法,性能要求非常高业务采用第五种方法。方法简介优点缺点方法一先用seq.nextval取出值,然后用转入变量的方式插入代码简单直观,使用的人也最多需要两次sql交互,性能不佳方法二先用seq.nextval直接插入记录,再用seq.currval取出新插入的值可以在插入记录后返回sequence,适合于数据插入业务逻辑不好改造的业务代码需要两次sql交互,性能不佳,并且容易产生并发安全问题方法三用pl/sql块的returning into语法,用CallableStatement对象设置输出参数取到新插入的值只要一次sql交互,性能较好需要采用pl/sql语法,代码不直观,使用较少方法四设置PreparedStatement需要返回新值的字段名,然后用getGeneratedKeys取得新插入的值性能良好,只要一次sql交互只有Oracle10g才支持,使用较少方法五returning into语法,用OraclePreparedStatement对象设置输出参数,再用getReturnResultSet取得新增入的值性能最好,因为只要一次sql交互,oracle9i也支持只能使用Oracle jdbc特有的OraclePreparedStatement对象

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1