ファイヤープロジェクト
SELECT
2004-05-03T18:50+09:00   matsu
ResultSet,ResultSetMetaDataを中心にSELECT結果の処理について調査してみた.
SELECT結果のデータには,CREATEやINSERTなどよりも複雑で多くのデータが含まれており,JDBCではResultSetオブジェクトに格納されている.JDBCを使用するプログラムでのSELECT結果を扱う処理は以下のような流れになる.
  1. DB接続
  2. Statementオブジェクト作成
    例 : Statement statement = dbConnection.createStatement ();
    
  3. SELECT文発行
    例 : ResultSet resultSet = statement.executeQuery (sql);
    
    • メタデータの確認
      例 : ResultSetMetaData metaData = resultSet.getMetaData();
      ...
      
    • 結果の取りだし
  4. Statementオブジェクトの開放
  5. 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(列番号)もある.
matsu(C)
Since 2002
Mail to matsu