有没有一种方法来检索一份声明自动增量ID(Is there a way to retrieve th

2019-06-21 18:09发布

有没有办法使用预处理语句一个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。

Answer 1:

是。 见这里 。 第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);
}


Answer 2:

有一对夫妇的方式,似乎不同的JDBC驱动程序处理的东西有点不同,或者根本没有在某些情况下(有些人会只给你自动生成主键,没有其他列),但其基本形式是

stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 

或者使用此表:

String autogenColumns[] = {"column1","column2"};
stmt = conn.prepareStatement(sql, autogenColumns)


Answer 3:

是的,有一个办法。 我刚刚发现这个隐藏在Java文档。

他们的方法是通过AutoGeneratedKeys ID如下

String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);


Answer 4:

我那些通过寻找这个问题的解决方案的几个线程冲浪之一......终于得到它的工作。 对于那些使用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开发,蟾蜍或使用相同的登录会话来执行插入,当你正在调试的任何客户端。 也不会影响你的每一次(调试调用)......直到你找到你的应用程序冻结无一例外一段时间。 是的...停止无一例外!



Answer 5:

    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); 
    }


文章来源: Is there a way to retrieve the autoincrement ID from a prepared statement