本文转自:http://blog.csdn.net/wwg2436/article/details/7638309
未作修改。
当插入一条记录时,我们很多时候都想马当前插入的主键返回出来.
别外.如果主键是自动生成的(大多数时候是这样),那么取回主键是一种比较困难的事.可能对于一些特殊的数据库必须把insert
在SQL server 很方便,有现程的sql可以用
INSERT
在Oracle中,网上有多种方案,但是程序老是有问题。所以自己研究后,有两种方案:
1, 用JDBC的getGeneratedKeys,返回的是Oracle 的rowid.但是就是修改代码,比较麻烦,第一次返回rowid, 第二次再通过rowid再查一次数据库。
String sql = "insert into xx_cust(cust_type,cust_name,login_name)"2,通过 用Oracle 的returning 语句
+ " 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);
因为要用到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);
}
}
----------------------------------------------------------------------------------------------
在应用中,很多时候会对表的主键用一个自动增涨的数来付值,如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();