6.1 Panimula sa RowSet

Tulad ng alam mo na, ang pamantayan ng JDBC ay halos 20 taong gulang at medyo luma na. Ang mga bagong uri at bagong klase ay dahan-dahang idinaragdag dito, ngunit hindi ito magagawa nang maganda sa lahat ng dako. At isa sa mga lugar na iyon ay ResultSet .

Ang database ay maaaring gawing mas mahusay, ngunit ang ResultSet interface ay hindi angkop. Bilang karagdagan, hindi namin tahasang ginagawa ang mga bagay nito kahit saan, ibinabalik sila sa amin ng executeQuery().

Ang mga tagalikha ng JDBC ay hindi nag-isip nang matagal at gumawa ng isang mekanismo na ganap na kahanay sa lahat ng nauna. At ito ay naging kilala bilang RowSet .

Narito ang mga pangunahing benepisyo nito:

  • Pinapalawak ng RowSet ang interface ng ResultSet, kaya mas malakas ang mga function nito kaysa sa ResultSet.
  • Ang RowSet ay nagna-navigate nang mas flexible sa data ng talahanayan at maaaring mag-scroll pabalik-balik.
  • Pinapanatili ng RowSet ang naka-cache na data na magagamit kahit na sarado na ang koneksyon.
  • Sinusuportahan ng RowSet ang bagong paraan ng koneksyon, maaari kang kumonekta sa database nang walang koneksyon. Sinusuportahan din nito ang pagbabasa ng XML data source.
  • Sinusuportahan ng RowSet ang filter ng data.
  • Sinusuportahan din ng RowSet ang mga operasyon ng pagsali sa talahanayan.

Mga uri ng rowset:

  • CachedRowSet
  • FilteredRowSet
  • JdbcRowSet
  • JoinRowSet
  • WebRowSet

6.2 Paglikha ng object ng RowSet

Mayroong tatlong magkakaibang paraan upang makakuha ng isang bagay sa trabaho.

Una, maaari itong punan ng data mula sa ResultSet na nakuha sa klasikal na paraan.

Halimbawa, maaari naming i-cache ang data ng ResultSet gamit ang 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

Pangalawa, maaari kang lumikha ng isang ganap na self-contained na object ng RowSet sa pamamagitan ng paglikha ng iyong sariling koneksyon sa database para dito:


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

At pangatlo, maaari mong ikonekta ang RowSet sa isang umiiral nang koneksyon:

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 Mga halimbawa ng pagtatrabaho sa RowSet

Halimbawa ng isa: pag-cache .

Sumulat tayo ng isang code kung saan ginagamit natin ang CachedRowSet upang i-cache ang lahat ng data at basahin ito mula sa isang nakasara nang koneksyon:

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

Halimbawa ng dalawa: pagpapalit ng mga hilera sa pamamagitan ng 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

Kung interesado ka sa kung paano ito gumagana, maaari mong basahin ang paksa sa opisyal na dokumentasyon. Ang gawain ko sa ngayon ay sabihin lang kung ano ito.