クエリの発行
クエリはStatementのメソッドを使用して発行する.SELECT文はexecuteQuery,それ以外はexecuteUpdateである.
前頁ではDBに接続,切断する方法について記述した.本頁では各種クエリを発行してみる.クエリを発行する際の手順の概要を以下にしめす.
- DB接続時に得られるConnectionオブジェクトから,Statementオブジェクトを得る.
- StatementオブジェクトにSQL文を渡してクエリを発行する(executeQuery,executeUpdateの実行).
- 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リソースを開放する.これは自動でも行なわれるようだが,いらなくなったら明示的に即開放するほうが健全だろう.

