6.1 Introducere în RowSet

După cum știți deja, standardul JDBC are aproape 20 de ani și este puțin depășit. Noi tipuri și clase noi se adaugă încet la el, dar acest lucru nu se poate face frumos peste tot. Și unul dintre acele locuri este ResultSet .

Baza de date poate fi făcută mai eficientă, dar interfața ResultSet nu se potrivește. În plus, nu îi creăm în mod explicit obiectele nicăieri, acestea ne sunt returnate de executeQuery().

Creatorii JDBC nu s-au gândit mult și au realizat un mecanism complet paralel cu tot ce a fost înainte. Și a devenit cunoscut sub numele de RowSet .

Iată principalele sale beneficii:

  • RowSet extinde interfața ResultSet, astfel încât funcțiile sale sunt mai puternice decât cele ale ResultSet.
  • RowSet navighează mai flexibil prin datele din tabel și poate derula înainte și înapoi.
  • RowSet păstrează datele stocate în cache care pot fi folosite chiar și după ce conexiunea este închisă.
  • RowSet acceptă o nouă metodă de conectare, vă puteți conecta la baza de date fără conexiune. De asemenea, acceptă citirea sursei de date XML.
  • RowSet acceptă filtrul de date.
  • RowSet acceptă și operațiuni de îmbinare la tabel.

Tipuri de seturi de rânduri:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Crearea unui obiect RowSet

Există trei moduri diferite de a obține un obiect de lucru.

În primul rând, poate fi completat cu date dintr -un ResultSet obținut în mod clasic.

De exemplu, putem stoca în cache datele ResultSet folosind 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

În al doilea rând, puteți crea un obiect RowSet complet autonom prin crearea propriei conexiuni la baza de date pentru acesta:


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

Și în al treilea rând, puteți conecta RowSet la o conexiune deja existentă:

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 Exemple de lucru cu RowSet

Exemplul unu: stocarea în cache .

Să scriem un cod în care folosim CachedRowSet pentru a stoca în cache toate datele și a le citi dintr-o conexiune deja închisă:

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

Exemplul doi: schimbarea rândurilor prin 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

Dacă sunteți interesat de modul în care funcționează, puteți citi subiectul în documentația oficială. Sarcina mea în acest moment este pur și simplu să spun ce este.