web-dev-qa-db-fra.com

MySQL & Java - Récupère l'identifiant de la dernière valeur insérée (JDBC)

Duplicate possible:
Comment obtenir l'ID d'insertion dans JDBC?

Bonjour, j'utilise JDBC pour me connecter à une base de données via Java.

Maintenant, je fais une requête d'insertion, et je dois obtenir l'id de la dernière valeur insérée (donc, après un stmt.executeUpdate).

Je n'ai pas besoin de quelque chose comme SELECT id FROM table ORDER BY id DESC LIMIT 1, Car j'ai peut-être des problèmes de simultanéité.

J'ai juste besoin de récupérer l'identifiant associé à la dernière insertion (à propos de mon instance de la déclaration).

J'ai essayé cela, mais il semble que cela ne fonctionne pas sur 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;
}

En fait, à chaque fois risultato = -1, Et j’obtiens Java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().

Comment puis-je résoudre ce problème? Merci Stackoverflow People :)

86
markzzz

Ne voudriez-vous pas simplement changer:

numero = stmt.executeUpdate(query);

à:

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

Jetez un coup d’œil à la documentation de l’interface JDBC Statement .

Mise à jour : Il semble y avoir beaucoup de confusion à propos de cette réponse, mais j’imagine que les personnes confuses ne le lisent pas dans le contexte de la question qui a été posée. Si vous prenez le code fourni par le PO dans sa question et remplacez la ligne unique (ligne 6) que je suggère, tout fonctionnera. La variable numero n'a aucune pertinence et sa valeur n'est jamais lue après son paramétrage.

166
Sean Bright

Sinon, vous pouvez faire:

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

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

Mais utilisez plutôt la réponse de Sean Bright pour votre scénario.

128
Buhake Sindi