ファイヤープロジェクト
クエリの発行
2004-04-21T09:00+09:00   matsu
クエリはStatementのメソッドを使用して発行する.SELECT文はexecuteQuery,それ以外はexecuteUpdateである.
前頁ではDBに接続,切断する方法について記述した.本頁では各種クエリを発行してみる.クエリを発行する際の手順の概要を以下にしめす.
  1. DB接続時に得られるConnectionオブジェクトから,Statementオブジェクトを得る.
  2. StatementオブジェクトにSQL文を渡してクエリを発行する(executeQuery,executeUpdateの実行).
  3. executeQuery,executeUpdateの結果から得られるResultSetオブジェクトから,クエリの実行結果を取り出す.
テーブル作成,レコード挿入,選択,レコード削除,テーブル削除を行なうサンプルを作成してみた.
これを実行してみる.
$> java ExecuteQuerySample jdbc:postgresql://dbserver/firstdb matsu hogefuga
Connect to jdbc:postgresql://thor/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 : SELECT * from jdbcsample WHERE id > 95 ; 
Got record : id = 96 value = Value96
Got record : id = 97 value = Value97
Got record : id = 98 value = Value98
Got record : id = 99 value = Value99
Execute SQL : DELETE FROM jdbcsample WHERE id < 10 ; 
Deleted 10 records
Execute SQL : UPDATE jdbcsample SET id = 500 WHERE id = 50 ;
Updated 1 records
Execute SQL : DROP TABLE jdbcsample;
StatementのメソッドexecuteUpdateは,CREATE,INSERT,UPDATE,DELETE,DROPを発行する際に使用する.サンプルではdoCreate,doInsert,doDelete,doUpdate,doDropメソッド内で呼び出している.executeUpdateを使用する際の流れは大体同じである.
//テーブル作成
private static void doCreate (Connection dbConnection) {
  String sql = "CREATE TABLE jdbcsample (id INTEGER PRIMARY KEY, value TEXT);";
  System.out.println("Execute SQL : " + sql);
  try {
    Statement statement = dbConnection.createStatement();
    statement.executeUpdate(sql);
    statement.close();
  } catch (SQLException sqle) {
    sqle.printStackTrace();
  }
}
executeUpdateの返り値は,INSERT,UPDATE,DELETEの場合は行数である.何も返さないSQL文の場合は0である.サンプルではINSERTした際に挿入行を確認している.
Statement statement = dbConnection.createStatement();
int insertNum = statement.executeUpdate(sql);
System.out.println("Inserted " + insertNum + " record.");
executeQueryは,SELECTを発行する際に使用する.executeQueryを呼び出すまでの処理の流れはexecuteUpdateの場合と同じである.サンプルではdoSelectでexecuteQueryを使用している.
//検索
private static void doSelect (Connection dbConnection, int keyId) {
  String sql = "SELECT * from jdbcsample WHERE id > " + keyId + " ; ";
  System.out.println("Execute SQL : " + sql);
  try {
    Statement statement = dbConnection.createStatement();
    ResultSet resultSet = statement.executeQuery(sql);
    while(resultSet.next()){
      System.out.println("Got record : id = " + resultSet.getInt("id")
			 + " value = " + resultSet.getString("value"));
    }
  } catch (SQLException sqle){
    sqle.printStackTrace();
  }
}
SELECTの場合は,結果としていろいろなものが返ってくる.executeQueryの返り値ResultSetオブジェクトにその検索結果が格納されていて,それをイテレータパターンでグリグリする.フィールドの取り出しには,フィールドの型に応じたgetterをフィールド名を指定しつつ呼び出す.サンプルでは,Integer型のidとText型のvalueを取り出している.
System.out.println("Got record : id = " + resultSet.getInt("id")
		 + " value = " + resultSet.getString("value"));
JDBC2.0ではResultSetは更新なども可能なようだが,話が長くなるので別頁に譲る.
executeUpdate,executeQueryを実行したあとは,StatementのcloseメソッドでDBリソースを開放する.これは自動でも行なわれるようだが,いらなくなったら明示的に即開放するほうが健全だろう.
matsu(C)
Since 2002
Mail to matsu