有没有办法使用预处理语句一个java查询时,检索从数据库查询自动生成的密钥。
例如,我知道AutoGeneratedKeys可以如下工作。
stmt = conn.createStatement();
stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
auto_id = rs.getInt(1);
}
然而。 如果我想要做一个插入一个事先准备好的声明。
String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql);
//this is an error
stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
//this is an error since the above is an error
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
auto_id = rs.getInt(1);
}
有没有办法做到这一点,我不知道。 这似乎从预处理语句不能返回自动生成的ID的Javadoc。
是。 见这里 。 第7.1.9。 更改您的代码:
String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
stmt.executeUpdate();
if(returnLastInsertId) {
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
auto_id = rs.getInt(1);
}
有一对夫妇的方式,似乎不同的JDBC驱动程序处理的东西有点不同,或者根本没有在某些情况下(有些人会只给你自动生成主键,没有其他列),但其基本形式是
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
或者使用此表:
String autogenColumns[] = {"column1","column2"};
stmt = conn.prepareStatement(sql, autogenColumns)
是的,有一个办法。 我刚刚发现这个隐藏在Java文档。
他们的方法是通过AutoGeneratedKeys ID如下
String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
我那些通过寻找这个问题的解决方案的几个线程冲浪之一......终于得到它的工作。 对于那些使用JDBC:神谕:薄:与ojdbc6.jar敬请注意:您可以使用方法:(方法1)
Try{
String yourSQL="insert into Table1(Id,Col2,Col3) values(SEQ.nextval,?,?)";
myPrepStatement = <Connection>.prepareStatement(yourSQL, Statement.RETURN_GENERATED_KEYS);
myPrepStatement.setInt(1, 123);
myPrepStatement.setInt(2, 123);
myPrepStatement.executeUpdate();
ResultSet rs = getGeneratedKeys;
if(rs.next()) {
java.sql.RowId rid=rs.getRowId(1);
//what you get is only a RowId ref, try make use of it anyway U could think of
System.out.println(rid);
}
} catch (SQLException e) {
//
}
(方法2)
Try{
String yourSQL="insert into Table1(Id,Col2,Col3) values(SEQ.nextval,?,?)";
//IMPORTANT: here's where other threads don tell U, you need to list ALL cols
//mentioned in your query in the array
myPrepStatement = <Connection>.prepareStatement(yourSQL, new String[]{"Id","Col2","Col3"});
myPrepStatement.setInt(1, 123);
myPrepStatement.setInt(2, 123);
myPrepStatement.executeUpdate();
ResultSet rs = getGeneratedKeys;
if(rs.next()) {
//In this exp, the autoKey val is in 1st col
int id=rs.getLong(1);
//now this's a real value of col Id
System.out.println(id);
}
} catch (SQLException e) {
//
}
基本上,尽量不要使用方法1,如果你只是想SEQ.Nextval的价值,b'cse它只是返回您可以破解你的头找到的方式来使用它,也不要配合rowid的裁判所有的数据输入你试过铸造它! 这可能正常工作(返回实际VAL)在MySQL,DB2而不是甲骨文。
AND,关掉你的SQL开发,蟾蜍或使用相同的登录会话来执行插入,当你正在调试的任何客户端。 也不会影响你的每一次(调试调用)......直到你找到你的应用程序冻结无一例外一段时间。 是的...停止无一例外!
Connection connection=null;
int generatedkey=0;
PreparedStatement pstmt=connection.prepareStatement("Your insert query");
ResultSet rs=pstmt.getGeneratedKeys();
if (rs.next()) {
generatedkey=rs.getInt(1);
System.out.println("Auto Generated Primary Key " + generatedkey);
}