Ejemplo de ResultSet scrollable y updatable

De ChuWiki

He metido todos los artículos de esta wiki y de http://chuidiang.org relativos a Java y JDBC en un pdf Libro JDBC Java. A través del enlace puedes comprarlo si tienes interés.

Viene de callableStatement()

ResultSet scrollable y updatable[editar]

Cuando hacemos una consulta a base de datos con una statement(), obtenemos un ResultSet en el que podemos ir leyendo los resultados de la consulta. Este ResultSet normalmente es sólo de lectura (no nos permite modificar la base de datos) y se va recorriendo secuencialmente, desde la primera fila de resultados a la última. Pues bien, podemos cambiar esta configuración al crear el Statement, de forma que obtengamos un ResultSet por el que podamos avanzar y retroceder, además de que nos permita modificar los datos. Sólo un detalle importante a tener en cuenta: Todo esto funciona si la consulta es una consulta simple a una única tabla de base de datos.

La forma de hacerlo es la siguiente

Statement st = conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = st.executeQuery("select * from tabla_prueba");

El primer parámetro, ResultSet.TYPE_SCROLL_INSENSITIVE, indica que el ResultSet debe ser navegable hacia delante y hacia atrás, de forma que una vez leídos los resultados, podamos retroceder para volver a leerlos. La parte _INSENSTIVE indica que no verá futuras modificaciones hechas por terceros en la base de datos, es decir, que si otro usuario cambia los datos en la base de datos, nuestro ResultSet no volverá a consultar la base de datos cada vez que le hagamos avanzar o retroceder, y no nos enteraremos de esos futuros cambios.

El segundo parámetro ResultSet.CONCUR_UPDATABLE nos indica que el ResultSet debe permitir modificar los datos en la base de datos desde el mismo ResultSet. La opción por defecto es sólo lectura, ResultSet.CONCUR_READ_ONLY.

El siguiente trozo de código, por ejemplo, lee los resultados de la forma normal, avanzando con el método next(), y cuando llega al final vuelve a recorrer los resultados, pero esta vez hacia atrás.

while (rs.next()){
   System.out.println(rs.getObject(1));
   System.out.println(rs.getObject(2));
}
           
while (rs.previous()){
   System.out.println(rs.getObject(1));
   System.out.println(rs.getObject(2));
}

Por supuesto, tenemos más métodos que nos permiten ir directamente a determinadas posiciones, como afterLast(), last(), beforeFirst() y first().

Modificar filas[editar]

También podemos modificar el contenido de la base de datos. Para ello, vamos recorriendo el ResultSet hasta llegar a la posición que nos interesa y una vez en esa posición, usamos los métodos update() para modificar el contenido. Primero se modifican las columnas concretas que nos interesan y finalmente se llama a updateRow() para hacer los cambios. En el siguiente código suponemos que ya nos hemos ido a la fila concreta que nos interesa del ResultSet. Ejecutamos entonces

rs.updateString(2, "nuevo texto");
rs.updateRow();

Borrar filas[editar]

Se puede también borrar una fila concreta. Para ello vamos recorriendo el ResultSet hasta llegar a ella y hacemos la llamada a

rs.deleteRow();

Insertar filas[editar]

Y finalmente, también es posible insertar nuevas filas. El ResultSet tiene un método especial que nos lleva a una fila "vacía" preparada para insertar. Este método es moveToInsertRow(). Una vez en ella, llamamos a los update() necesarios para dar valores a cada columna y finalmente llamamos a insertRow() para hacer efectivos los cambios. El siguiente trozo de código es un ejemplo de todo esto

rs.moveToInsertRow();
rs.updateString(2, "nueva fila");
rs.insertRow();

Sigue en Meta datos de la base de datos