6.1 Въведение в RowSet

Както вече знаете, стандартът JDBC е почти на 20 години и е малко остарял. Нови типове и нови класове бавно се добавят към него, но това не може да се направи красиво навсякъде. И едно от тези места е ResultSet .

Базата данни може да бъде напequalsа по-ефективна, но интерфейсът ResultSet не пасва добре. В допълнение, ние не създаваме изрично неговите обекти никъде, те ни се връщат от executeQuery().

Създателите на JDBC не мислиха дълго и направиха механизъм, който е напълно паралелен на всичко, което беше преди. И стана известен като RowSet .

Ето основните му предимства:

  • RowSet разширява интерфейса ResultSet, така че неговите функции са по-мощни от тези на ResultSet.
  • RowSet навигира по-гъвкаво през данните от tableта и може да превърта напред и назад.
  • RowSet поддържа кеширани данни, които могат да се използват дори след затваряне на връзката.
  • RowSet поддържа нов метод на свързване, можете да се свържете към база данни без връзка. Той също така поддържа четене на източника на XML данни.
  • RowSet поддържа филтър за данни.
  • RowSet също поддържа операции за свързване на таблици.

Типове редове:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Създаване на обект RowSet

Има три различни начина да получите работен обект.

Първо, той може да бъде попълнен с данни от ResultSet , получен по класическия начин.

Например можем да кешираме ResultSet данни с помощта на 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

Второ, можете да създадете напълно самостоятелен обект RowSet , като създадете своя собствена връзка към база данни за него:


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

И трето, можете да свържете RowSet към вече съществуваща връзка:

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 Примери за работа с RowSet

Първи пример: кеширане .

Нека напишем code, в който използваме 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

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

Пример две: промяна на редове чрез 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

Ако се интересувате How работи, можете да прочетете темата в официалната documentация. Моята задача в момента е просто да кажа Howво е то.