概要
JDBCでは、java.sql.Statement
インタフェースをベースとして、java.sql.PreparedStatement
とjava.sql.CallableStatement
の2つのサブインタフェースでSQLを扱う。
PreparedStatement
SQL文を事前に準備してデータベースに効率的に実行するためのインタフェースである。
主なメソッド
-
void setXxx(int parameterIndex, Xxx x)
:
指定の型のパラメータを指定されたインデックスにセットする。 -
void getXxx(Xxx)
:
実行後の出力パラメータの値を取得する。
引数は以下のいずれかで渡す。- 列番号を
int
型で渡す。
(例)getInt(1)
- 列名を
String
型で渡す。
(例)getString("name")
- 列番号を
列番号は0からではなく1から始まる点に注意する。
-
ResultSet executeQuery()
:
SELECTクエリを実行し、結果をResultSet
として返す。 -
int executeUpdate()
:
INSERT、UPDATE、DELETEなどのSELECTクエリ以外を実行し、影響を受けた行数を返す。 -
boolean execute()
:
実行結果が「検索した結果を保持するResultSet
型オブジェクトか」をboolean
型で返す。-
true
の場合:検索のSQLと判断 -
false
の場合:挿入、更新、削除のいずれかのSQLと判断
-
これら3つのメソッドは以下のように使い分ける。
- 挿入、更新、削除のいずれかの場合
executeUpdate()
- 検索の場合
executeQuery()
- 実行するSQLの種類が決まっていない場合
execute()
-
int[] executeBatch()
:一度に複数のクエリを実行できる。
void addBatch()
メソッドを使用してSQL文を登録する。
例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PreparedStatementExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "your_username";
String password = "your_password";
try (Connection connection = DriverManager.getConnection(url, user, password)) {
String query = "SELECT * FROM employees WHERE department = ?";
int departmentId = 123; // 仮に部署IDが123だとします
// PreparedStatementを作成
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, departmentId); // パラメータを設定
// クエリを実行し結果を取得
ResultSet resultSet = preparedStatement.executeQuery();
// 結果を処理
while (resultSet.next()) {
// レコードの処理
int empId = resultSet.getInt("employee_id");
String empName = resultSet.getString("employee_name");
// 他のカラムも必要に応じて処理
System.out.println("Employee ID: " + empId + ", Employee Name: " + empName);
}
// リソースをクローズ
resultSet.close();
preparedStatement.close();
} catch (SQLException e) {
System.err.println("データベース接続エラー: " + e.getMessage());
}
}
}
この例では、PreparedStatement
クラスを使って、部署IDをパラメータとして受け取るSQLクエリを実行している。
setInt()
メソッドを使用してパラメータの値を設定し、executeQuery()
メソッドを呼び出して結果を取得している。
このように、パラメータ化されたクエリを実行することで、セキュリティが向上し、パフォーマンスも改善される。
CallableStatementインタフェース
PreparedStatement
と同様にSQL文を実行するためインタフェースであるが、主な違いは、ストアド・プロシージャ1を実行することができる点である。
主なメソッド
-
registerOutParameter(int parameterIndex, int sqlType)
:
ストアド・プロシージャが出力パラメータを持つ場合に、それらのパラメータを登録する。 -
prepareCall(String sql)
:
呼び出すストアド・プロシージャ名を渡して取得する。 -
setXxx(int parameterIndex, Xxx value)
:
ストアド・プロシージャに渡すパラメータを設定する。 -
execute()
:ストアド・プロシージャを実行する。 -
getXxx(int parameterIndex)
:
実行後の出力パラメータの値を取得する。
例
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
public class CallableStatementExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "your_username";
String password = "your_password";
try (Connection connection = DriverManager.getConnection(url, user, password)) {
String procedureCall = "{call my_stored_procedure(?, ?)}";
// CallableStatementを作成
CallableStatement callableStatement = connection.prepareCall(procedureCall);
callableStatement.setInt(1, 123); // ストアド・プロシージャに渡すパラメータを設定
callableStatement.registerOutParameter(2, Types.INTEGER); // 出力パラメータを登録
// ストアド・プロシージャを実行
callableStatement.execute();
// 出力パラメータの値を取得
int result = callableStatement.getInt(2);
System.out.println("ストアド・プロシージャの結果: " + result);
// リソースをクローズ
callableStatement.close();
} catch (SQLException e) {
System.err.println("データベース接続エラー: " + e.getMessage());
}
}
}
この例では、CallableStatement
クラスを使って、my_stored_procedure
という名前のストアド・プロシージャを呼び出しており、以下の順で処理している。
①:setInt()
メソッドを使用して入力パラメータを設定
②:registerOutParameter()
メソッドを使用して出力パラメータを登録
③:execute()
メソッドでストアド・プロシージャを実行
④:getInt()
メソッドで結果を取得
CallableStatement
クラスを使用すると、ストアド・プロシージャを簡単に呼び出し、その結果を取得することができる。
PreparedStatementとCallableStatementの違い
主な違いとして、使用目的と用途が挙げられる。
使用目的
- PreparedStatement:
- パラメータ化されたSQLクエリを実行するためのインタフェース。
- CallableStatement:
- データベース内で定義されたストアド・プロシージャやストアド・ファンクションを呼び出すためのインタフェース。
用途
-
PreparedStatement:
- 動的なパラメータを持つSQLクエリを事前に準備しておき、効率的に実行できる。
- 主にSELECT、INSERT、UPDATE、DELETEなどの非ストアド・プロシージャクエリを実行する際に使用する。
-
CallableStatement:
- 主にストアド・プロシージャやストアド・ファンクションの呼び出し時に使用する。
また、共通点は以下である。
-
?
を使ってパラメータを指定し、その後にsetXXX()
メソッドを使用してパラメータ値を設定する。
-
SQL文や専用の言語を組み合わせて処理手順を記述し、データベースに対する連続した複数の処理を1つのプログラムにまとめ、DBMSに保存したもの。 ↩