web-dev-qa-db-ja.com

MySQL&Java-最後に挿入された値のIDを取得(JDBC)

可能性のある複製:
JDBCで挿入IDを取得する方法

こんにちは、JDBCを使用して、Java経由でデータベースに接続しています。

今、私はいくつかの挿入クエリを行い、最後に挿入された値のIDを取得する必要があります(したがって、stmt.executeUpdateの後に)。

同時実行の問題がある可能性があるため、SELECT id FROM table ORDER BY id DESC LIMIT 1のようなものは必要ありません。

最後の挿入に関連付けられたIDを取得するだけです(ステートメントの私のインスタンスについて)。

私はこれを試しましたが、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の人々に感謝します:)

86
markzzz

ただ変えてみませんか:

numero = stmt.executeUpdate(query);

に:

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

JDBC Statement インターフェースのドキュメントをご覧ください。

Update:どうやらこの回答について多くの混乱がありますが、私の推測では、混乱している人々はこの文脈でそれを読んでいないようです。尋ねられた質問。 OPが彼の質問で提供したコードを取り、私が提案している1行(6行目)を置き換えると、すべてが機能します。 numero変数は完全に無関係であり、設定後に値が読み取られることはありません。

166
Sean Bright

または、次のこともできます。

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

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

ただし、シナリオにはSean Brightの答えを代わりに使用してください。

128
Buhake Sindi