6.1 RowSet の概要

すでにご存知のとおり、JDBC 標準は 20 年近く前のもので、少し時代遅れです。新しいタイプと新しいクラスが徐々に追加されていますが、これはどこでも美しくできるわけではありません。それらの場所の 1 つはResultSetです。

データベースをより効率的にすることはできますが、ResultSetインターフェイスはあまり適していません。さらに、そのオブジェクトはどこにも明示的に作成されず、 によって返されますexecuteQuery()

JDBC の作成者は、じっくり考えず、これまでのものすべてと完全に並行するメカニズムを作成しました。そして、それはRowSetとして知られるようになりました。

主な利点は次のとおりです。

  • RowSet は ResultSet インターフェイスを拡張するため、その関数は ResultSet の関数よりも強力です。
  • RowSet はテーブル データ内をより柔軟に移動し、前後にスクロールできます。
  • RowSet は、接続が閉じられた後でも使用できるキャッシュされたデータを保持します。
  • RowSet は新しい接続方法をサポートし、接続なしでデータベースに接続できます。XML データ ソースの読み取りもサポートします。
  • RowSet はデータ フィルターをサポートします。
  • RowSet はテーブル結合操作もサポートします。

行セットのタイプ:

  • キャッシュされた行セット
  • フィルターされた行セット
  • JdbcRowSet
  • 行セットに参加
  • WebRowSet

6.2 RowSet オブジェクトの作成

作業オブジェクトを取得するには 3 つの異なる方法があります。

まず、従来の方法で取得したResultSetからのデータを埋め込むことができます。

たとえば、CachedRowSetを使用してResultSetデータをキャッシュできます。


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

次に、独自のデータベース接続を作成することで、完全に自己完結型のRowSetオブジェクトを作成できます。


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

そして 3 番目に、RowSet を既存の接続に接続できます。

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 RowSet の使用例

例 1:キャッシュ

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

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

例 2: 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

それがどのように機能するかに興味がある場合は、公式ドキュメントのトピックを読むことができます。現時点での私の仕事は、それが何であるかを伝えることだけです。