6.1 Introducción a RowSet

Como ya sabes, el estándar JDBC tiene casi 20 años y está un poco desactualizado. Poco a poco se le están agregando nuevos tipos y nuevas clases, pero esto no se puede hacer de manera hermosa en todas partes. Y uno de esos lugares es ResultSet .

La base de datos se puede hacer más eficiente, pero la interfaz de ResultSet no encaja bien. Además, no creamos explícitamente sus objetos en ninguna parte, nos los devuelve el executeQuery().

Los creadores de JDBC no pensaron mucho e hicieron un mecanismo que es completamente paralelo a todo lo que había antes. Y se hizo conocido como RowSet .

Estos son sus principales beneficios:

  • RowSet amplía la interfaz de ResultSet, por lo que sus funciones son más potentes que las de ResultSet.
  • RowSet navega de manera más flexible a través de los datos de la tabla y puede desplazarse hacia adelante y hacia atrás.
  • RowSet mantiene datos en caché que se pueden usar incluso después de que se cierra la conexión.
  • RowSet admite un nuevo método de conexión, puede conectarse a la base de datos sin conexión. También admite la lectura de la fuente de datos XML.
  • RowSet admite el filtro de datos.
  • RowSet también admite operaciones de combinación de tablas.

Tipos de conjuntos de filas:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Crear un objeto RowSet

Hay tres formas diferentes de obtener un objeto de trabajo.

Primero, se puede llenar con datos de un ResultSet obtenido de la forma clásica.

Por ejemplo, podemos almacenar en caché los datos de ResultSet usando CachedRowSet :


Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
 
RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);		// Use ResultSet to populate

En segundo lugar, puede crear un objeto RowSet completamente autónomo creando su propia conexión de base de datos para él:


JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
rowSet.setUrl("jdbc:mysql://localhost:3306/test");
rowSet.setUsername("root");
rowSet.setPassword("secret");
 
rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

Y en tercer lugar, puede conectar el RowSet a una conexión ya existente:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
JdbcRowSet rowSet = new JdbcRowSetImpl(con);

rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

6.3 Ejemplos de trabajo con RowSet

Ejemplo uno: almacenamiento en caché .

Escribamos un código donde usemos CachedRowSet para almacenar en caché todos los datos y leerlos desde una conexión ya cerrada:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);	// Use ResultSet to populate

connection.close();		// Close the connection

// Cache data is still available
while(crs.next()) {
  	System.out.println(crs.getString(1)+"\t"+ crs.getString(2)+"\t"+ crs.getString(3));
}

Ejemplo dos: cambiar filas a través de RowSet :

// Connect to the database
 CachedRowSet crs = rsf.createCachedRowSet();
 crs.setUrl("jdbc:mysql://localhost/test");
 crs.setUsername("root");
 crs.setPassword("root");
 crs.setCommand("SELECT * FROM user");
 crs.execute();

// This type of operation can only change standalone RowSet
// First, move the pointer to an empty (new) string, the current position is remembered
 crs.moveToInsertRow();
 crs.updateString(1, Random.nextInt());
 crs.updateString(2, "Clone" + System.currentTimeMillis());
 crs.updateString(3, "Female");
 crs.insertRow();  // Add the current (new) line to the rest of the lines
 crs.moveToCurrentRow(); // Return a pointer to the line where it was before insertion

 crs.beforeFirst();
 while(crs.next()) {
 	System.out.println(crs.getString(1) + "," + crs.getString(2) + "," + crs.getString(3));
}

// And now we can upload all our changes to the database
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
con.setAutoCommit(false); // Needed for synchronization
crs.acceptChanges(con);// Synchronize data to database

Si está interesado en cómo funciona, puede leer el tema en la documentación oficial. Mi tarea en este momento es simplemente decir lo que es.