//公共代码:得到数据库连接

public Connection getConnection() throwsException{

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

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

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

public int insertDataReturnKeyByGetNextVal() throwsException {

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.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);returnid;

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

public int insertDataReturnKeyByGetCurrVal() throwsException {

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.prepareStatement(vsql);

ResultSet rs=pstmt.executeQuery();

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

rs.close();

pstmt.close();

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

}//方法三//采用pl/sql的returning into语法,可以用CallableStatement对象设置registerOutParameter取得输出变量的值。//这种方法的优点是只要一次sql交互,性能较好,缺点是需要采用pl/sql语法,代码不直观,使用较少。

public int insertDataReturnKeyByPlsql() throwsException {

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();int id=cstmt.getInt(1);

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

cstmt.close();returnid;

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

public int insertDataReturnKeyByGeneratedKeys() throwsException {

Connection conn=getConnection();

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

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

pstmt.executeUpdate();

ResultSet rs=pstmt.getGeneratedKeys();

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

rs.close();

pstmt.close();

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

}//方法五//和方法三类似,采用oracle特有的returning into语法,设置输出参数,但是不同的地方是采用OraclePreparedStatement对象,因为jdbc规范里标准的PreparedStatement对象是不能设置输出类型参数。//最后用getReturnResultSet取到新插入的sequence值,//这种方法的优点是性能最好,因为只要一次sql交互,oracle9i也支持,缺点是只能使用Oracle jdbc特有的OraclePreparedStatement对象。

public int insertDataReturnKeyByReturnInto() throwsException {

Connection conn=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.next();int id=rs.getInt(1);

rs.close();

pstmt.close();

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

}

java代码读取dbsequence的值_JDBC读取新插入Oracle数据库Sequence值的5种方法相关推荐

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

    Oracle的sequence实现非常灵活,所以也带来一些易用性问题,如何取到新插入记录生成的sequence值与其它数据库有较大差别,本文详国介绍了5种实现读取新插入记录sequence值的方法. ...

  2. JAVA读取excel数据(插入oracle数据库)

    本实例做的是读取execl(只能读取.xls的execl,即只能读取03版的),如果是.xlsx类型的话 手工转化一下即可,应用的jar包是apache的poi系类的jar包和ojdbc14.jar的 ...

  3. VS中C#读取app.config数据库配置字符串的三种方法(转)

    关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet, ...

  4. java中doc文件转为pdf文件_java将doc文件转换为pdf文件的三种方法

    标签: http://feifei.im/archives/93 ---------------------------------------------- 项目要用到doc转pdf的功能,一番go ...

  5. oracle存储查询出来的值_技术分享|浅析ORACLE数据库物理体系结构及其对应优化策略...

    张志国 合肥科技研发中心 Oracle数据库服务器有两个主要的组成部分:数据库和实例(instance).Oracle数据库用于存储和检索信息,是数据的集合.Oracle实例是指数据库服务器的内存及相 ...

  6. java mvc中重复提交表单,spring mvc 防止重复提交表单的两种方法,推荐第二种

    第一种方法:判断session中保存的token 比较麻烦,每次在提交表单时都必须传入上次的token.而且当一个页面使用ajax时,多个表单提交就会有问题. 注解Token代码: package c ...

  7. java中domain什么意思_java解析URL中domain、端口和协议的两种方法

    java解析URL中domain.端口和协议的两种方法 Java代码 收藏代码 @Test public void parseDomain() throws IOException { for (in ...

  8. 当post 的字段很多,post的字段并不完全修改(有的值是前端input的值,有的任保留原来原来数据库的值),...

    有一种解决方法(ps:from ljq):  把数据库的值先全部遍历出来,然后再对遍历出来值的$key进行一个判断, example: foreach ($results[0] as $key =&g ...

  9. Java代码实现本地创建文件,读取文件,删除指定目录下的文件

    目录 一.需求: 二.实现: 1.完成创建文件,写入文件 2.读取文件 3.删除文件 测试: 注意: java的split方法分割字符串(分隔符如* | . ^ )及注意点 一.需求: 1.创建文件夹 ...

最新文章

  1. c四舍五入取整函数_学会这8个Excel函数,工作瞬间好轻松!
  2. 深度学习--Keras总结
  3. XP访问Linux共享错误提示
  4. android addtextchangedlistener参数,【Android】关于addTextChangedListener()方法的上机记录...
  5. 【Python】元组和列表相关知识总结
  6. 管理博文Hive大数据-Mysql的安装和启动---大数据之Hive工作笔记0007
  7. 不小心执行了rm-rf,除了跑路,如何恢复?
  8. 安装MYSQL的思考与分析_mysql安装和基本使用
  9. Steve Thair谈DevOps on Windows的演变与面临的挑战
  10. Memcache分组和同步机制的实现
  11. pyplot设置刻度字体大小以及标签字体大小
  12. 同域下iframe父页面和子页面调用
  13. C#中类的修饰符,this关键字和static关键字
  14. [译] TensorFlow 教程 #15 - 风格迁移
  15. extjs 兼容性问题解决方案
  16. 1212 无向图最小生成树
  17. Tensorflow keras中实现语义分割多分类指标:IOU、MIOU
  18. hevc_nvenc 详细分析1
  19. ffmpeg音视频处理
  20. c语言中 程序各步作用,C语言学习网总结C语言学习五步曲

热门文章

  1. MongoDB 启动基于角色的登录认证功能
  2. DPM 2010(二)---BMR裸机恢复域控制器
  3. 卡车紧急刹车加强系统(发明畅想)
  4. 京东购物车双11实战
  5. idea shell 中的函数 跳转_6 个珍藏已久 IDEA 小技巧,这一波全部分享给你!
  6. php动态网页设计制作作业成品
  7. android.os.parcelable,Android中Parcelable如可快速生成
  8. android布局边缘加深,Android布局属性详解
  9. matlab封闭传递包求解,梯度下降和封闭形式的解决方案 - MATLAB中不同的假设线...
  10. 英文字符串过长,QLabel显示不全的问题