MySQL LAST_INSERT_ID() desde Java
Una base de datos como MySQL presenta una serie de procedimientos bastante útiles. Para quedar claros, los procedemientos son métodos propios que tiene el motor de una base de datos, en este caso MySQL. Estós procedemientos pueden ser ejecutas desde java, si el procedimiento retorna algún tipo de resultado entonces desde nuestra aplicación hecha en java la podemos atrapar, y manipular a nuestro antojo.
En el siguiente ejemplo vamos a ver como hacer uso de un procedemiento de MySQL llamado MySQL LAST_INSERT_ID() que es el encargado de retornar el último ID insertado en una tabla que tiene columnas autonúmericas. Este método es bastante útil si lo que queremos es insertar nosotros mismo un registro con ID específico sin repertirlo con ningún otro registro, o lo más importante: seguir la secuencia.
Lo primero que haremos será hacer la conexión.
Class.forName("com.mysql.jdbc.Driver");
Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/nombre-base-de-datos", "usuario", "contraseña");
Creamos una instancia del objeto Statement que podemos usar para poder ejecuatar la consulta a la bas de datos, de manera que, en caso de que la consulta retorne algún valor lo podamos manipular o actualizar
Statement statement = conexion.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_UPDATABLE);
Para este ejemplo, vamos a crear una tabla llamada tutorial que va a tener dos columnas: idTutorial y datos. La columan idTutorial tiene la condición de autoIncremento-java-java.
statement.executeUpdate("DROP TABLE IF EXISTS tutorial");
statement.executeUpdate("CREATE TABLE tutorial(" + "idTutorial INT NOT NULL AUTO_INCREMENT, " + "datos VARCHAR(64), PRIMARY KEY (idTutorial))");
Ahora vamos a insertar un registro que va a generar un valor de autoincrementoJava para el campo idTutorial.
statement.executeUpdate("INSERT INTO tutorial(datos) " + "values ('Se puede tomar el valor del AUTO_INCREMENT?')", Statement.RETURN_GENERATED_KEYS);
La siguiente línea de código hace uso de la constante Statement.getGeneratedKeys() para extraer el valor de autoincrementado. Esté es un método propiamente de java. Primero vamos a extraer el valor del autoincremente con la función de java, y luego vamos a extraer el valor de autoincremento con la función de MySLQ.
Primero con la función de java:
int autoincrementoJava = -1;
ResultSet resulset = statement.getGeneratedKeys();
if (resulset.next()) {
// al llamar el método getGeneratedKeys(); devuelve una tabla con una sola columna, solo vamos a usar la columna con índice 1 de tipo int
autoincrementoJava= resulset.getInt(1);
} else {
// agregar una excepcion acá
}
resulset.close();
Ahora vamos a extraer el valor del autoincremento con la función de MySQL LAST_INSERT_ID() MySQl. Básicamente hace los mismo que la función getGeneratedKeys() de java.
int autoincrementoMysql= -1;
resulset = statement.executeQuery("SELECT LAST_INSERT_ID()");
if (resulset.next()) {
// al ejecutar la consulta, el resulset va a almacenar una tabla con una sola columna, solo vamos a usar la columna con índice 1 de tipo int
autoincrementoMysql= resulset.getInt(1);
} else {
// agregar una excepcion acá
}
resulset.close();
Sin embargo, a pesar de que tenemos estas dos formas anteriores de extraer el último idTutorial insertado con el AUTO_INCREMENT podemos también el resulset para determinar dicho valor:
resulset = statement.executeQuery("SELECT idTutorial, datos " + "FROM tutorial");
resulset.moveToInsertRow();
resulset.updateString("datos", "AUTO INCREMENT here?");
resulset.insertRow();
// se agrega el registro al final de la tabla
resulset.last();
// ahora nos detenemos en la fila que recién hemos insertado.
int autoincrementoResulset = resulset.getInt("idTutorial");
resulset.close();
resulset = null;
Para verificar que todo quedó bien imprimimos el valor de cada variable según su función
System.out.println("Valor de auto_increment con la función getGeneratedKeys():" + autoincrementoJava);
System.out.println("Valor de auto_increment con la función " + "'SELECT LAST_INSERT_ID()': " + autoincrementoMysql);
System.out.println("Valor del id al insertar un registro en la tabla: " + autoincrementoResulset);
La salida de aplicación sería algo asi:
Valor de auto_increment con la función getGeneratedKeys(): 1
Valor de auto_increment con la función SELECT LAST_INSERT_ID(): 1
Valor del id al insertar un registro en la tabla: 2
Aquí dejo la fuente: Principal.java
GRACIAS, Gracias Gracias, Estoy en mi tesis y necesitaba buscar el ultimo id, Gracias de pana no sabes cuanto tiempo tengo tratando de lograrlo, tu blog me cayo del CIELO.
Saludos.
Me alegra mucho que te haya servido
hola como estan amigos como puego guardar images grandes en mysql desde java por favor me prodian explicar
saludos a todos ustedes amigos
Hola @llanque,
En el indice de temas del blog tienes un ejemplo de como guardar una imagen en MySQL
hola que tal y con este LAST_INSERT_ID() no tendria poblemas de concurrencia. por que necesito hacer una consulta asi y guardarla en otra tabla…gracias
INSERTAR REGISTROS
———————
Conexion_DB var_conexion = new Conexion_DB();
var_conexion.Abrir_Conexion();
Statement stm;
try {
stm = var_conexion.conex.createStatement();
String sql;
sql = “INSERT INTO ahorros (“;
sql += “aho_Cta” + “,”;
sql += “Aho_Titular” + “,”;
sql += “Aho_Fecha” + “,”;
sql += “Aho_Tipo” + “,”;
sql += “Aho_Saldo”;
sql += “)”;
sql += ” VALUES(“;
sql += “‘” + this.Aho_Cta.getText() + “‘,”;
sql += “‘” + this.Aho_Titular.getText() + “‘,”;
sql += “‘” + this.Aho_Fecha.getText() + “‘,”;
sql += “‘” + this.Aho_Tipo + “‘,”;
sql += “‘” + Double.parseDouble(this.Aho_Saldo.getText()) + “‘”;
sql += “)”;
stm.executeUpdate(sql);
JOptionPane.showMessageDialog(null, “Registro guardado con éxito …”, ” .::MENSAJE::.”, JOptionPane.INFORMATION_MESSAGE);
} catch (SQLException ex) {
System.out.print(“Error: “+ ex.getMessage());
}