MySQL和Java - 获取最后插入值的ID(JDBC)

102

可能重复的问题:
如何在JDBC中获取插入ID?

您好,我正在使用JDBC通过Java连接数据库。

现在,我进行了一些插入查询,并且需要获取最后插入值的id(即,在stmt.executeUpdate之后)。

我不需要像SELECT id FROM table ORDER BY id DESC LIMIT 1这样的东西,因为我可能会遇到并发问题。

我只需要检索与最后一个插入相关联的id(关于我的Statement实例)。

我尝试过这个,但似乎在JDBC上不起作用:

public Integer insertQueryGetId(String query) {
    Integer numero=0;
    Integer risultato=-1;
    try {
        Statement stmt = db.createStatement();
        numero = stmt.executeUpdate(query);

        ResultSet rs = stmt.getGeneratedKeys();
        if (rs.next()){
            risultato=rs.getInt(1);
        }
        rs.close();

        stmt.close();
    } catch (Exception e) {
        e.printStackTrace();
        errore = e.getMessage();
        risultato=-1;
    }
  return risultato;
}
实际上,每次 `risultato = -1`,我都会收到 `java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement()` 的错误消息。
我该如何解决这个问题?感谢 Stackoverflow 社区。

请查看我的问题:https://dev59.com/D2855IYBdhLWcg3wpmHw - Buhake Sindi
JDBC中如何获取插入ID?的副本。 - BalusC
2个回答

183

你会不会只需更改:

numero = stmt.executeUpdate(query);

目标地址:

numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);

请查看JDBC Statement接口的文档。

更新:显然对这个答案有很多困惑,但我猜想那些困惑的人没有在问题的上下文中阅读。如果您采用OP在其问题中提供的代码并替换我建议的单行(第6行),则一切都将正常。变量numero完全无关紧要,并且在设置后其值永远不会被读取。


1
你太棒了!哈哈,我看不懂这个警告信息 :) - markzzz
1
+1 代表 RETURN_GENERATED_KEYS - bizzr3
是的,这并不真正起作用。尝试插入几条记录,删除所有记录(不是TRUNCATE),然后查看是否检索到正确的ID ;) - Pierre
3
@wu-lee,在OP的问题中,返回值是无关紧要的(numero未被使用)。 请注意,他正在迭代Statement.getGeneratedKeys()返回的ResultSet。如果您有其他问题,请告诉我。 - Sean Bright
2
这就是错的了...方法executeUpdate返回: (1) SQL数据操作语言(DML)语句的行数或(2)对于不返回任何内容的SQL语句为0。 你必须创建结果集并像这样获取最后一个ID:rs = st.getGeneratedKeys();if(rs.next()) { insertId = rs.getInt(1); } - slodeveloper
显示剩余4条评论

146

或者您可以采用以下方法:

Statement stmt = db.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
numero = stmt.executeUpdate();

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()){
    risultato=rs.getString(1);
}

但对于你的情况,请使用Sean Bright的答案。


如果您的表键有任何分区,这段代码将会出错。我的建议是使用 risultato=rs.getString(1);。 - Ferhat KOÇER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接