Recuperar el id autogenerado tras insert en Java

Si una base de datos relacional está bien diseñada, las tablas deberían tener un identificador o id, que muchas veces será autogenerado de forma que se evite duplicidades. Si se realiza un insert y se quiere asociar alguna otra tabla mediante una relación, es posible que resulte necesario recuperar el id autogenerado tras el insert para establecer la relación o para realizar alguna operación más sobre el registro recién insertado.

En el caso que se quiera realizar una asociación, hay algunos frameworks de Java como Hibernate, que ya se encarga de esta gestión, independientemente si se utiliza MySQL, Oracle, SQL Server, PostgreSQL o cualquier otro motor de base de datos. Pero si nuestra aplicación no lo usa, se puede recuperar por código sin necesidad de hacer una select sobre la tabla que devuelva el máximo id (max(id)), por ejemplo.

Para recuperar el id autogenerado tras el insert, se puede aprovechar la llamada a prepareStatement para que devuelva el valor generado sin necesidad de lanzar otra consulta sobre la base de datos, lo que lo hace más eficiente. Para ello, habrá que pasarle como parámetro, a parte de la sentencia insert, el parámetro Statement.RETURN_GENERATED_KEYS, para notificarle que debe devolver ese valor y recuperar el id para java.

Por último, para recogerlo se puede recuperar el ResultSet devuelto por el método getGeneratedKeys() una vez ha terminado la ejecución de la inserción. Este ResultSet, al igual que cualquier otro, se puede recorrer con la ayuda del método next(). En este caso sólo tendrá un registro, por lo que no hará falta recorrerlo en bucle, sino que simplemente con un if para comprobar que tiene valor se puede recuperar como un integer y guardarlo en una variable (en el ejemplo, idGenerado) y trabajar con ella.

final Connection connection = 
        DataSourceUtils.getConnection(getJdbcTemplate().getDataSource());
String insert = "INSERT INTO tabla VALUES('campo1', 'campo2')";
PreparedStatement statement = 
       connection.prepareStatement(insert,
                                      Statement.RETURN_GENERATED_KEYS);
int affectedRows = statement.executeUpdate();
if (affectedRows == 0) {
        throw new SQLException("No se pudo guardar");
}

ResultSet generatedKeys = statement.getGeneratedKeys();
if (generatedKeys.next()) {
         idGenerado = generatedKeys.getInt(1);
}

Deja un comentario

Pin It on Pinterest