9.6 Modificación (update)
Para poder modificar los datos que contiene un ResultSet necesitamos un ResultSet de tipo modificable. Para ello debemos utilizar la constante ResultSet.CONCUR_UPDATABLE al llamar al método createStatement() como se ha visto antes.
Para modificar los valores de un registro existente se utilizan una serie de métodos updateXXX() de ResultSet. Las XXX indican el tipo del dato y hay tantos distintos como sucede con los métodos getXXX() de este mismo interfaz: updateString(), updateInt(), updateDouble(), updateDate(), etc.
La diferencia es que los métodos updateXXX() necesitan dos argumentos:
- La columna que deseamos actualizar (por su nombre o por su número de columna).
- El valor que queremos almacenar en dicha columna (del tipo que sea).
Por ejemplo para modificar el campo edad almacenando el entero 28 habría que llamar al siguiente método, suponiendo que rs es un objeto ResultSet:
También podría hacerse de la siguiente manera, suponiendo que la columna edad es la segunda:
Los métodos updateXXX() no devuelven ningún valor (son de tipo void). Si se produce algún error se lanzará una SQLException.
Posteriormente hay que llamar al método updateRow() para que los cambios realizados se apliquen sobre la base de datos. El Driver JDBC se encargará de ejecutar las sentencias SQL necesarias. Esta es una característica muy potente ya que nos facilita enormemente la tarea de modificar los datos de una base de datos. Este método devuelve void.
En resumen, el proceso para realizar la modificación de una fila de un ResultSet es el siguiente:
- Desplazamos el cursor al registro que queremos modificar.
- Llamamos a todos los métodos updateXXX(columna, valor a modificar) que necesitemos.
- Llamamos a
updateRow()para que los cambios se apliquen a la base de datos.
Es importante entender que hay que llamar a updateRow() antes de desplazar el cursor.
Si desplazamos el cursor antes de llamar a updateRow(), se perderán los cambios.
Si queremos cancelar las modificaciones de un registro del ResultSet podemos llamar a cancelRowUpdates(), que cancela todas las modificaciones realizadas sobre el registro actual.
Si ya hemos llamado a updateRow() el método cancelRowUpdates() no tendrá ningún efecto.
El siguiente código de ejemplo muestra cómo modificar el campo direccion del último registro de un ResultSet que contiene el resultado de una SELECT sobre la tabla de clientes. Supondremos que conn es un objeto Connection previamente creado: