1.概要
この記事では、JDBCの RowSet インターフェース について説明します。 JDBCの RowSet オブジェクトは、結果セットよりも適応性が高く、使用が簡単なスタイルで表形式のデータを保持します。
RowSetを最も頻繁に使用するために、5つの RowSet__インタフェースが定義されています。
-
JdbcRowSet
-
CachedRowSet
-
WebRowSet
-
JoinRowSet
-
FilteredRowSet
このチュートリアルでは、これらの RowSet インターフェイスの使用方法について説明します。
2. JdbcRowSet
JdbcRowSet から始めましょう - 単に Connection オブジェクトを JdbcRowSetImpl に渡して作成します。
JdbcRowSet jdbcRS = new JdbcRowSetImpl(conn);
jdbcRS.setType(ResultSet.TYPE__SCROLL__INSENSITIVE);
String sql = "SELECT ** FROM customers";
jdbcRS.setCommand(sql);
jdbcRS.execute();
jdbcRS.addRowSetListener(new ExampleListener());
while (jdbcRS.next()) {
//each call to next, generates a cursorMoved event
System.out.println("id = " + jdbcRS.getString(1));
System.out.println("name = " + jdbcRS.getString(2));
}
上記の例では、メソッド setCommand を使用してSQLステートメントを定義してからメソッド execute を実行するまで、 jdbcRs にデータは含まれていません。
また、イベント処理を実行するために、 RowSetListener を__JdbcRowSetに追加したことにも注意してください。
JdbcRowSet は、他の4つの RowSet 実装とは異なります。これは、 データベースに常に接続されているためです。 このため、 ResultSet オブジェクトに最も似ています。
3. CachedRowSet
CachedRowSet オブジェクトは、データソースに接続しなくても動作できるため、ユニークです。これを「切断された RowSet オブジェクト」と呼びます。
CachedRowSet は、データベースに格納されているデータではなく独自のデータを操作できるように、データをメモリにキャッシュするという事実により、名前が付けられます。
CachedRowSet インタフェースは、切断されたすべてのRowSetオブジェクトの スーパーインタフェース なので、以下で確認するコードは、 __ WebRowSe t、 JoinRowSet 、または FilteredRowSe __tにも適用できます。
CachedRowSet crs = new CachedRowSetImpl();
crs.setUsername(username);
crs.setPassword(password);
crs.setUrl(url);
crs.setCommand(sql);
crs.execute();
crs.addRowSetListener(new ExampleListener());
while (crs.next()) {
if (crs.getInt("id") == 1) {
System.out.println("CRS found customer1 and will remove the record.");
crs.deleteRow();
break;
}
}
4. WebRowSet
次に、 WebRowSet を見てみましょう。
これはまた、 CachedRowSet オブジェクトの機能を提供することに加えて、それ自身をXMLドキュメントに書き込むことができ、またそのXMLドキュメントを読み込んで WebRowSet に変換することもできるので、ユニークです。
WebRowSet wrs = new WebRowSetImpl();
wrs.setUsername(username);
wrs.setPassword(password);
wrs.setUrl(url);
wrs.setCommand(sql);
wrs.execute();
FileOutputStream ostream = new FileOutputStream("customers.xml");
wrs.writeXml(ostream);
writeXml メソッドを使用して、 WebRowSet オブジェクトの現在の状態をXMLドキュメントに書き込みます。
writeXml メソッドに OutputStream オブジェクトを渡すことで、文字ではなくバイトで書き込みます。これは、あらゆる形式のデータを処理するのに非常に役立ちます。
5. JoinRowSet
JoinRowSet を使用すると、メモリ内にある場合、 RowSet オブジェクト間にSQL JOIN を作成できます。これは、1つ以上の接続を作成しなければならないことによるオーバーヘッドを削減できるため、重要です。
CachedRowSetImpl customers = new CachedRowSetImpl();//configuration of settings for CachedRowSet
CachedRowSetImpl associates = new CachedRowSetImpl();//configuration of settings for this CachedRowSet
JoinRowSet jrs = new JoinRowSetImpl();
jrs.addRowSet(customers,ID);
jrs.addRowSet(associates,ID);
JoinRowSet オブジェクトに追加された各 RowSet オブジェクトには、一致する列(SQLの JOIN の基になる列)が必要なので、 addRowSet メソッドで “ id” を指定します。
列名を使用するのではなく、列番号を使用することもできます。
6. FilteredRowSet
最後に、 FilteredRowSet を使用すると、 RowSet オブジェクト内に表示される行数を 削減できるため、作業内容に関連するデータだけを処理できます。
Predicate インターフェースの実装を使用して、データをどのように「フィルタリング」するかを決定します。
public class FilterExample implements Predicate {
private Pattern pattern;
public FilterExample(String regexQuery) {
if (regexQuery != null && !regexQuery.isEmpty()) {
pattern = Pattern.compile(regexQuery);
}
}
public boolean evaluate(RowSet rs) {
try {
if (!rs.isAfterLast()) {
String name = rs.getString("name");
System.out.println(String.format(
"Searching for pattern '%s' in %s", pattern.toString(),
name));
Matcher matcher = pattern.matcher(name);
return matcher.matches();
} else
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
//methods for handling errors
}
そのフィルタを FilteredRowSet オブジェクトに適用します。
RowSetFactory rsf = RowSetProvider.newFactory();
FilteredRowSet frs = rsf.createFilteredRowSet();
frs.setCommand("select ** from customers");
frs.execute(conn);
frs.setFilter(new FilterExample("^[A-C].** "));
ResultSetMetaData rsmd = frs.getMetaData();
int columncount = rsmd.getColumnCount();
while (frs.next()) {
for (int i = 1; i <= columncount; i++) {
System.out.println(
rsmd.getColumnLabel(i)
+ " = "
+ frs.getObject(i) + " ");
}
}
7.まとめ
このクイックチュートリアルでは、JDKで利用可能な RowSet インタフェースの5つの標準実装について説明しました。
各実装の構成について説明し、それらの違いについて説明しました。
既に説明したように、 RowSet 実装のうちの1つだけが、接続された RowSet オブジェクト、つまり JdbcRowSet です。他の4つは切断された RowSet オブジェクトです。
そしていつものように、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/core-java-persistence[over Github]で見つけることができます。