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.
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.