Rowset

Vamos a ver una interfaz de manipulación de datos que nos ofrece más posibilidades que lo hemos estado usando hasta ahora -> Resulset Dicha interfaz es RowSet, que se encuentra en el paquete javax.sql Descargar. Esta interfaz tiene muchos tipos: JdbcRowSet, CachedRowSet, WebRowSet, FilteredRowSet o JoinRowSet. Las que vamos a usar es JdbcRowSet.

Imagen Resulset

Si os fijáis RowSet hereda toda la funcionalidades de ResultSet, lo que nos aporta RowSet es mayor flexibilidad y posibilidades.

Ventajas y diferencias entres RowSet y ResultSet

RowSet ResultSet
paquete javax.sql paquete java.sql
puede estas desconectado de la BD siempre debe mantener la conexión con la BD
flexibilidad en la navegación siempre hacia delante (next())
puede ser serializable y transmitirlo no puede ser serializable
es un Java.Bean no es un Java.Bean se obtiene del método executeQuey()
se puede utilizar para actualizaciones sólo se utiliza de consulta

Creación y consulta

Una vez importado el jar de javax.sql podemos crear un objeto tipo JdbcRowSet, con un factory y asignarle lo necesario para conectarse a la base de datos:

JdbcRowSet rowSet;
try {
    //obtenemos el rowset de forma estatica
    rowSet = RowSetProvider.newFactory().createJdbcRowSet();
    rowSet.setUrl("jdbc:mysql://localhost:3306/Empresa");

    rowSet.setUsername("root");
    rowSet.setPassword("xxxxx");

    // Asignamos consulta y ejecutamos 
    rowSet.setCommand("select * from employees");
    rowSet.execute();

Los métodos setCommand() y execute() asigna consulta y la ejecuta.

Recorrer resultado y navegación

Como ya sabéis podemos usar el método next() para ir recorriendo fila a fila:

while (rowSet.next()) {
                System.out.println("Id: "  + rowSet.getInt(1));
                System.out.println("Name: " + rowSet.getString(2));
                System.out.println("Posicion: " + rowSet.getString(3));
            }

Método más interesantes de navegación:

  • previous(): hacia atrás.
  • absolute(int i): colocarse en una una posición concreta (empieza en 1).
  • first(): primer registro.
  • last(): último registro.

Actualizar registros

No sólo nos sirve para recorrer y navegar por los registros del resultado de una consulta, también podemos usarlo para actualizar información:

Donde se encuentra el cursor podemos actualizar un campo:

rset.updateString("PRODUCT", "HDMI CABLE");
rowSet.updateRow();

Con este método updateXXX() debes elegir el tipo de dato a actualizar. El primer argumento nombre de columna de la consulta o número (posición). Y ejecutar updateRow().

Realizar inserciones

RowSet también nos permite realizar inserciones usando el método moveToInsertRow() para colocarse en posición de inserción y usando los updates correspondientes. Es necesario ejecutar insertRow() para confirmar el nuevo registro:

rowSet.moveToInsertRow();
rowSet.updateInt("emp_id", 500);
rowSet.updateString("name", "Paco");
rowSet.updateString("posicion", "secretario");
rowSet.updateFloat("salary",10000);
rowSet.insertRow();

Borrado de filas

Usamos el método deleteRow() una vez te coloques en el registro que quieres eliminar.

Consultas parametrizadas

Exactamente igual que con ResultSet, necesitamos las “?” para indicar el parámetro de entrada, y existen los “set`s” correspondientes para asignar el valor al parámetro.

Ejercicio 1

Partiendo de la base de datos Empresa y la tabla Person realiza un programa que nos permita estas operaciones (usar RowSet en la mayoría de casos):

  • Mostrar todos los registros.
  • Mostrar el número de personas de la empresa.
  • Mostrar un registro por la posición. Una vez colocado que nos permita mostrar el anterior registro o el siguiente.
  • Actualizar una edad de una persona, indicando la posición.
  • Eliminar último registro.
  • Insertar una nueva persona en la empresa.

Extra: Por si queréis más

  • Típicos patrones de diseño con datos: DAO y Repository.
  • Frameworks de persistencia: Hibernate y JPA.
  • Uso de NoSQL con Java.
  • Transacciones y uso de objetos grandes (imágenes, ficheros etc…) Blob/Clob.