欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

如何得到JDBC Insert 语句执行后插入数据库记录的主键

程序员文章站 2022-04-06 09:20:56
...

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 rowid
System.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();