6.1 Pengenalan kepada RowSet

Seperti yang anda sedia maklum, piawaian JDBC sudah hampir 20 tahun dan agak ketinggalan zaman. Jenis baharu dan kelas baharu perlahan-lahan ditambahkan padanya, tetapi ini tidak boleh dilakukan dengan cantik di mana-mana sahaja. Dan salah satu tempat itu ialah ResultSet .

Pangkalan data boleh dibuat lebih cekap, tetapi antara muka ResultSet tidak sesuai. Di samping itu, kami tidak mencipta objeknya secara eksplisit di mana-mana sahaja, ia dikembalikan kepada kami oleh executeQuery().

Pencipta JDBC tidak berfikir panjang dan membuat mekanisme yang benar-benar selari dengan semua yang sebelum ini. Dan ia dikenali sebagai RowSet .

Berikut adalah faedah utamanya:

  • RowSet memanjangkan antara muka ResultSet, jadi fungsinya lebih berkuasa daripada ResultSet.
  • RowSet menavigasi dengan lebih fleksibel melalui data jadual dan boleh menatal ke depan dan ke belakang.
  • RowSet mengekalkan data cache yang boleh digunakan walaupun selepas sambungan ditutup.
  • RowSet menyokong kaedah sambungan baharu, anda boleh menyambung ke pangkalan data tanpa sambungan. Ia juga menyokong membaca sumber data XML.
  • RowSet menyokong penapis data.
  • RowSet juga menyokong operasi gabungan jadual.

Jenis set baris:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Mencipta objek RowSet

Terdapat tiga cara berbeza untuk mendapatkan objek kerja.

Pertama, ia boleh diisi dengan data daripada ResultSet yang diperoleh dengan cara klasik.

Sebagai contoh, kita boleh 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 boleh mencipta objek RowSet serba lengkap dengan mencipta sambungan pangkalan data 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 boleh menyambungkan RowSet ke sambungan yang sedia 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 kita tulis kod di mana kita menggunakan CachedRowSet untuk cache semua data dan membacanya daripada sambungan yang telah 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: menukar 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 berminat dengan cara ia berfungsi, anda boleh membaca topik dalam dokumentasi rasmi. Tugas saya pada masa ini hanyalah untuk memberitahu apa itu.