6.1 Wprowadzenie do zestawu wierszy

Jak już wiesz, standard JDBC ma prawie 20 lat i jest trochę przestarzały. Powoli dodawane są do niego nowe typy i nowe klasy, ale nie wszędzie da się to pięknie zrobić. Jednym z takich miejsc jest ResultSet .

Bazę danych można usprawnić, ale interfejs ResultSet jest słabo dopasowany. Ponadto nigdzie jawnie nie tworzymy jego obiektów, są one nam zwracane przez executeQuery().

Twórcy JDBC nie zastanawiali się długo i stworzyli mechanizm, który jest całkowicie równoległy do ​​wszystkiego, co było wcześniej. I stał się znany jako RowSet .

Oto jego główne zalety:

  • RowSet rozszerza interfejs ResultSet, więc jego funkcje są potężniejsze niż ResultSet.
  • RowSet porusza się bardziej elastycznie po danych tabeli i może przewijać tam iz powrotem.
  • RowSet przechowuje dane w pamięci podręcznej, z których można korzystać nawet po zamknięciu połączenia.
  • RowSet obsługuje nową metodę połączenia, możesz łączyć się z bazą danych bez połączenia. Obsługuje również odczyt źródła danych XML.
  • RowSet obsługuje filtr danych.
  • RowSet obsługuje również operacje łączenia tabel.

Typy zestawów wierszy:

  • Buforowany zestaw wierszy
  • Filtrowany zestaw wierszy
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Tworzenie obiektu RowSet

Obiekt roboczy można uzyskać na trzy różne sposoby.

Po pierwsze, można go wypełnić danymi z ResultSet uzyskanymi w klasyczny sposób.

Na przykład możemy buforować dane ResultSet za pomocą 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

Po drugie, możesz stworzyć całkowicie samodzielny obiekt RowSet , tworząc dla niego własne połączenie z bazą danych:


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

Po trzecie, możesz podłączyć RowSet do już istniejącego połączenia:

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 Przykłady pracy z RowSet

Przykład pierwszy: buforowanie .

Napiszmy kod, w którym używamy CachedRowSet do buforowania wszystkich danych i odczytywania ich z już zamkniętego połączenia:

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

Przykład drugi: zmiana wierszy za pomocą 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

Jeśli jesteś zainteresowany tym, jak to działa, możesz przeczytać temat w oficjalnej dokumentacji. Moim zadaniem w tej chwili jest po prostu powiedzieć, co to jest.