MySQL & Java-Obtener id del último valor insertado (JDBC) [duplicar]


Posible Duplicado:
¿Cómo obtener el ID de inserción en JDBC?

Hola, estoy usando JDBC para conectarme a la base de datos a través de Java.

Ahora, hago alguna consulta de inserción, y necesito obtener el id del último valor insertado (por lo tanto, después de un stmt.executeUpdate).

No necesito algo como SELECT id FROM table ORDER BY id DESC LIMIT 1, porque puedo tener problemas de concurrencia.

Solo necesito recuperar el id asociado a la última inserción (sobre mi instancia de la Instrucción).

Probé esto, pero parece que no funciona en 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;
}

De hecho, cada vez risultato = -1, y consigo java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().

¿Cómo puedo solucionar este problema? Gracias a la gente de Stackoverflow:)

Author: Community, 2010-11-22

2 answers

¿No cambiarías:

numero = stmt.executeUpdate(query);

A:

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

Eche un vistazo a la documentación para el JDBC Statement interfaz.

Actualización: Aparentemente hay mucha confusión acerca de esta respuesta, pero mi conjetura es que las personas que están confundidas no la están leyendo en el contexto de la pregunta que se hizo. Si toma el código que el OP proporcionó en su pregunta y reemplaza la línea única (línea 6) que estoy sugiriendo, todo funcionará. El numero variable es completamente irrelevante y su valor nunca se lee después de que se establece.

 156
Author: Sean Bright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-26 20:35:38

Alternativamente puedes hacer:

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

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

Pero usa la respuesta de Sean Bright para tu escenario.

 118
Author: Buhake Sindi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-22 14:58:49