http://blog.csdn.net/wwg2436/article/details/7638309 未作修改。 当插入一条记录时,我们很多时候都想马当前插入的主键返回出来. 别外.如果主键是自动生成的(大多数时候是这样),那么取回主键是一种比较困难的事. 可能对于一些特殊的数据库必须把insert int
http://blog.csdn.net/wwg2436/article/details/7638309
未作修改。
当插入一条记录时,我们很多时候都想马当前插入的主键返回出来.
别外.如果主键是自动生成的(大多数时候是这样),那么取回主键是一种比较困难的事.
可能对于一些特殊的数据库必须把insert into和select max(key)或什么序列当前值作为一个事务的原子来操作,但很多数据库(以及数据库操作环境)并不能为你提供事务并发控制.所以如果多人同时操作,那么select max(key)很可能就不是你刚才insert的那条记录.
在sql server 很方便,有现程的sql可以用
insert into tablename (fieldlist ...) values (valuelist ...) select @@identity as aliasname;
在oracle中,网上有多种方案,但是程序老是有问题。所以自己研究后,有两种方案:
1, 用jdbc的getgeneratedkeys,返回的是oracle 的rowid.但是就是修改代码,比较麻烦,第一次返回rowid, 第二次再通过rowid再查一次数据库。
string sql = insert into xx_cust(cust_type,cust_name,login_name)+ values('ipn','aaa','bb');connection conn = dbconnectionmanager.getconnection();preparedstatement sta = conn.preparestatement(sql,statement.return_generated_keys);sta.execute();system.out.println(sta.getgeneratedkeys());resultset rest = sta.getgeneratedkeys();rest.next();string rowid=rest.getstring(1);system.out.println(rowid=+rowid);preparedstatement stat=conn.preparestatement(select cust_id from xx_cust where rowid=?);stat.setstring(1, rowid);resultset rest2 = stat.executequery();rest2.next();string custid=rest2.getstring(1);system.out.println(custid=+custid);
2,通过 用oracle 的returning 语句
因为要用到oracle自己的api,所以如何用到像c3po等通用数据库连接池的话可以不能用。但是在数据库只连接一次。
代码如下:
class.forname(oracle.jdbc.driver.oracledriver).newinstance(); string url=jdbc:oracle:thin:@192.168.3.95:1521:tdm; //orcl为数据库的sid string user=pesup; string password=pesup; connection conn= drivermanager.getconnection(url,user,password);string sql = insert into xx_cust(cust_type,cust_name,login_name)+ values('ipn','aaa','bb') returning cust_id into ?;oraclepreparedstatement sta = (oraclepreparedstatement) conn.preparestatement(sql);sta.registerreturnparameter(1, oracletypes.integer);int count = sta.executeupdate();if (count > 0) {resultset rset = sta.getreturnresultset();while (rset.next()) {string name = rset.getstring(1);system.out.println(name= + name);}}
----------------------------------------------------------------------------------------------
如何得到jdbc insert 语句执行后插入oracle 数据库记录的主键
在应用中,很多时候会对表的主键用一个自动增涨的数来付值,如oracle的sequence,插入后又想得到的主键的值。下面介绍一下相关的方法。
1,用oracle 的returning 语句。
preparedstatement sta = conn.preparestatement(insert into logging values (testseq.nextval,sysdate)returning id into ? );sta.execute();resultset rset = sta.getresultset();while(rset.next()){int id = rset.getint(1);}2,用jdbc的getgeneratedkeys,返回的是oracle 的rowid.preparedstatement sta = conn.preparestatement(insert into testtable values (testseq.nextval,'aaaa'),statement.return_generated_keys);sta.execute();system.out.println(sta.getgeneratedkeys());resultset rest = sta.getgeneratedkeys();rest.next();//oracle rowidsystem.out.println(rest.getstring(1));
--------------------------------------------------------------------------------------------
获取自动生成的键值,int id primary key auto_increment;
class.forname(com.mysql.jdbc.driver); connection conn = drivermanager .getconnection(jdbc:mysql://localhost/bbs?user=root&password=root); //连接数据库conn.setautocommit(false); //不自动提交 string sql = insert into article values (null,0,?,?,?,now(),0);preparedstatement pstat = conn.preparestatement(sql,statement.return_generated_keys);//创建一个默认 preparedstatement 对象,该对象能获取自动生成的键,适合insert语句//(该语句能自动生成键值)autogeneratedkeys - 指示是否应该返回自动生成的键的标志//它是 statement.return_generated_keys 或 statement.no_generated_keys 之一statement stat = conn.createstatement();pstat.setint(1, -1);pstat.setstring(2,title);pstat.setstring(3,content);pstat.executeupdate();resultset rskey = pstat.getgeneratedkeys(); //resultset 指示键值rskey.next();int key = rskey.getint(1); //得到第一个键值rskey.close();stat.executeupdate(update article set rootid = + key + where id = + key);conn.commit();conn.setautocommit(true); //设回自动提交pstat.close();conn.close();