6.1 Pengantar RowSet

Seperti yang sudah Anda ketahui, standar JDBC hampir berusia 20 tahun dan sedikit ketinggalan jaman. Jenis baru dan kelas baru perlahan ditambahkan ke dalamnya, tetapi ini tidak dapat dilakukan dengan indah di mana-mana. Dan salah satu tempat itu adalah ResultSet .

Basis data dapat dibuat lebih efisien, tetapi antarmuka ResultSet kurang cocok. Selain itu, kami tidak secara eksplisit membuat objeknya di mana pun, mereka dikembalikan kepada kami oleh executeQuery().

Pembuat JDBC tidak berpikir panjang dan membuat mekanisme yang sepenuhnya paralel dengan semua yang ada sebelumnya. Dan itu dikenal sebagai RowSet .

Inilah manfaat utamanya:

  • RowSet memperluas antarmuka ResultSet, sehingga fungsinya lebih kuat daripada ResultSet.
  • RowSet menavigasi lebih fleksibel melalui data tabel dan dapat menggulir bolak-balik.
  • RowSet menyimpan data cache yang dapat digunakan bahkan setelah koneksi ditutup.
  • RowSet mendukung metode koneksi baru, Anda dapat terhubung ke database tanpa koneksi. Ini juga mendukung membaca sumber data XML.
  • RowSet mendukung filter data.
  • RowSet juga mendukung operasi penggabungan tabel.

Jenis baris:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Membuat objek RowSet

Ada tiga cara berbeda untuk mendapatkan objek kerja.

Pertama, dapat diisi dengan data dari ResultSet yang diperoleh dengan cara klasik.

Misalnya, kita dapat meng-cache data ResultSet menggunakan 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

Kedua, Anda dapat membuat objek RowSet mandiri sepenuhnya dengan membuat koneksi database Anda sendiri untuknya:


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

Dan ketiga, Anda dapat menghubungkan RowSet ke koneksi yang sudah ada:

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 Contoh bekerja dengan RowSet

Contoh satu: caching .

Mari tulis kode di mana kita menggunakan CachedRowSet untuk menyimpan semua data dalam cache dan membacanya dari koneksi yang sudah ditutup:

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

Contoh dua: mengubah baris melalui 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

Jika Anda tertarik dengan cara kerjanya, Anda dapat membaca topik tersebut di dokumentasi resmi. Tugas saya saat ini hanyalah mengatakan apa itu.