SELECT
ResultSet,ResultSetMetaDataを中心にSELECT結果の処理について調査してみた.
SELECT結果のデータには,CREATEやINSERTなどよりも複雑で多くのデータが含まれており,JDBCではResultSetオブジェクトに格納されている.JDBCを使用するプログラムでのSELECT結果を扱う処理は以下のような流れになる.
実行結果.
- DB接続
- Statementオブジェクト作成
例 : Statement statement = dbConnection.createStatement ();
- SELECT文発行
例 : ResultSet resultSet = statement.executeQuery (sql);
-
- メタデータの確認
例 : ResultSetMetaData metaData = resultSet.getMetaData(); ...
- 結果の取りだし
- メタデータの確認
- Statementオブジェクトの開放
- DB切断
$ java SelectSample jdbc:postgresql://dbserver/firstdb matsu hogefuga Connect to jdbc:postgresql://dbserver/firstdb User : matsu Pwd : hogefuga Execute SQL : CREATE TABLE jdbcsample (id INTEGER PRIMARY KEY, value TEXT); Execute SQL : INSERT INTO jdbcsample VALUES(0,'Value0'); ... Inserted 1 record. Execute SQL : INSERT INTO jdbcsample VALUES(1,'Value1'); ... Inserted 1 record. Execute SQL : INSERT INTO jdbcsample VALUES(2,'Value2'); ... Inserted 1 record. Execute SQL : INSERT INTO jdbcsample VALUES(3,'Value3'); ... Inserted 1 record. Execute SQL : INSERT INTO jdbcsample VALUES(4,'Value4'); ... Inserted 1 record. Execute SQL : SELECT * from jdbcsample ; MetaData : column count = 2 MetaData : column name[type] = id[int4] Nullable UNKNOWN MetaData : column name[type] = value[text] Nullable UNKNOWN Got record : id = 0 value = Value0 Got record : id = 1 value = Value1 Got record : id = 2 value = Value2 Got record : id = 3 value = Value3 Got record : id = 4 value = Value4 Execute SQL : DROP TABLE jdbcsample;本頁ではResultSet,ResultSetMetaDataのメソッド呼び出しについて記述する.
SELECT結果を取り出す際に,場合によってはメタデータを取得して列数や列名,型を取得する必要がある.そのようなデータはResultSetMetaDataオブジェクトに格納されており,ResultSetから取得する.
Statement statement = dbConnection.createStatement (); ResultSet resultSet = statement.executeQuery (sql); ResultSetMetaData metaData = resultSet.getMetaData ();このResultSetMetaDataオブジェクトを使用すると,ResultSetオブジェクトからどういったデータを取得できるかがわかる.以下は列数を取得,表示し,さらに全列の名前と型,NULL可能か否かを出力している.
// 列数の表示
int columnCount = metaData.getColumnCount ();
System.out.println ("MetaData : column count = " + columnCount);
// 各列の名前,型名,NOT NULL制約についての表示
for (int i = 1; i <= columnCount; i++)
{
System.out.print ("MetaData : column name[type] = " +
metaData.getColumnName (i) + "[" +
metaData.getColumnTypeName (i) + "] ");
switch (metaData.isNullable (i))
{
case ResultSetMetaData.columnNullable:
System.out.println ("Nullable");
break;
case ResultSetMetaData.columnNoNulls:
System.out.println ("NOT Nullable");
break;
case ResultSetMetaData.columnNullableUnknown:
System.out.println ("Nullable UNKNOWN");
break;
}
}
SELECT結果のレコードはResultSetに格納されており,フィールド名または何列目かを引数にして,型毎に用意されたメソッドでそれぞれ取得する.
while (resultSet.next ())
{
System.out.println ("Got record : id = " + resultSet.getInt ("id")
+ " value = " + resultSet.getString ("value"));
}
ReusltSetオブジェクトには複数のレコードが格納されており,next()で順に処理していくことができる.「get型名(フィールド名)」と「get型名(列番号)」という対でメソッドが用意されている.例えばgetInt(フィールド名)があれば,getInt(列番号)もある.

