6.1 Introduction à RowSet

Comme vous le savez déjà, la norme JDBC a presque 20 ans et est un peu dépassée. De nouveaux types et de nouvelles classes y sont lentement ajoutés, mais cela ne peut pas être fait magnifiquement partout. Et l'un de ces endroits est ResultSet .

La base de données peut être rendue plus efficace, mais l' interface ResultSet est mal adaptée. De plus, nous ne créons explicitement ses objets nulle part, ils nous sont retournés par le executeQuery().

Les créateurs de JDBC n'ont pas réfléchi longtemps et ont créé un mécanisme complètement parallèle à tout ce qui existait auparavant. Et il est devenu connu sous le nom de RowSet .

Voici ses principaux avantages :

  • RowSet étend l'interface ResultSet, de sorte que ses fonctions sont plus puissantes que celles de ResultSet.
  • RowSet navigue de manière plus flexible dans les données de la table et peut défiler d'avant en arrière.
  • RowSet conserve les données mises en cache qui peuvent être utilisées même après la fermeture de la connexion.
  • RowSet prend en charge une nouvelle méthode de connexion, vous pouvez vous connecter à la base de données sans connexion. Il prend également en charge la lecture de la source de données XML.
  • RowSet prend en charge le filtre de données.
  • RowSet prend également en charge les opérations de jointure de table.

Types d'ensemble de lignes :

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Création d'un objet RowSet

Il existe trois manières différentes d'obtenir un objet de travail.

Tout d'abord, il peut être rempli avec les données d' un ResultSet obtenu de manière classique.

Par exemple, nous pouvons mettre en cache les données ResultSet en utilisant 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

Deuxièmement, vous pouvez créer un objet RowSet entièrement autonome en créant votre propre connexion à la base de données :


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();

Et troisièmement, vous pouvez connecter le RowSet à une connexion déjà existante :

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 Exemples de travail avec RowSet

Exemple 1 : mise en cache .

Écrivons un code dans lequel nous utilisons CachedRowSet pour mettre en cache toutes les données et les lire à partir d'une connexion déjà fermée :

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));
}

Exemple 2 : modification des lignes via 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 vous êtes intéressé par son fonctionnement, vous pouvez lire le sujet dans la documentation officielle. Ma tâche pour le moment est simplement de dire ce que c'est.