Jdbc-statements
JDBC-ステートメント、PreparedStatementおよびCallableStatement
接続が確立されると、データベースと対話できます。 JDBC Statement、CallableStatement、、および_PreparedStatement_インターフェイスは、SQLまたはPL/SQLコマンドを送信し、データベースからデータを受信できるようにするメソッドとプロパティを定義します。
また、データベースで使用されるJavaデータ型とSQLデータ型のデータ型の違いを埋めるのに役立つメソッドも定義します。
次の表に、使用するインターフェイスを決定するための各インターフェイスの目的の概要を示します。
Interfaces | Recommended Use |
---|---|
Statement | Use this for general-purpose access to your database. Useful when you are using static SQL statements at runtime. The Statement interface cannot accept parameters. |
PreparedStatement | Use this when you plan to use the SQL statements many times. The PreparedStatement interface accepts input parameters at runtime. |
CallableStatement | Use this when you want to access the database stored procedures. The CallableStatement interface can also accept runtime input parameters. |
ステートメントオブジェクト
ステートメントオブジェクトの作成
次の例のように、Statementオブジェクトを使用してSQLステートメントを実行する前に、ConnectionオブジェクトのcreateStatement()メソッドを使用してSQLステートメントを作成する必要があります-
Statement stmt = null;
try {
stmt = conn.createStatement( );
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}
Statementオブジェクトを作成したら、それを使用して、3つの実行メソッドのいずれかでSQLステートメントを実行できます。
- * boolean execute(String SQL)*:ResultSetオブジェクトを取得できる場合、trueのブール値を返します。それ以外の場合は、falseを返します。 このメソッドを使用して、SQL DDLステートメントを実行するか、本当に動的なSQLを使用する必要がある場合に使用します。
- * int executeUpdate(String SQL)*:SQLステートメントの実行により影響を受ける行の数を返します。 このメソッドを使用して、影響を受ける行の数を取得する予定のSQLステートメント(たとえば、INSERT、UPDATE、またはDELETEステートメント)を実行します。
- * ResultSet executeQuery(String SQL)*:ResultSetオブジェクトを返します。 SELECTステートメントの場合と同様に、結果セットを取得する予定がある場合は、このメソッドを使用します。
ステートメントオブジェクトを閉じる
Connectionオブジェクトを閉じてデータベースリソースを節約するのと同じ理由で、Statementオブジェクトも閉じる必要があります。
close()メソッドを単純に呼び出すと、ジョブが実行されます。 最初にConnectionオブジェクトを閉じると、Statementオブジェクトも閉じます。 ただし、適切にクリーンアップするために、Statementオブジェクトを常に明示的に閉じる必要があります。
Statement stmt = null;
try {
stmt = conn.createStatement( );
. . .
}
catch (SQLException e) {
. . .
}
finally {
stmt.close();
}
よりよく理解するために、リンク:/jdbc/statement-object-example [Statement-Example tutorial]を検討することをお勧めします。
PreparedStatementオブジェクト
_PreparedStatement_インターフェースは、Statementインターフェースを拡張します。これにより、汎用のStatementオブジェクトに比べていくつかの利点を持つ機能が追加されます。
このステートメントは、引数を動的に提供する柔軟性を提供します。
PreparedStatementオブジェクトの作成
PreparedStatement pstmt = null;
try {
String SQL = "Update Employees SET age = ? WHERE id = ?";
pstmt = conn.prepareStatement(SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}
JDBCのすべてのパラメーターは、パラメーターマーカーと呼ばれる*?*記号で表されます。 SQLステートメントを実行する前に、すべてのパラメーターの値を指定する必要があります。
- setXXX()メソッドは、値をパラメーターにバインドします。 *XXX は、入力パラメーターにバインドする値のJavaデータ型を表します。 値の指定を忘れると、SQLExceptionを受け取ります。
各パラメーターマーカーは、その順序位置によって参照されます。 最初のマーカーは位置1、次の位置2などを表します。 このメソッドは、0から始まるJava配列インデックスのメソッドとは異なります。
データベース(a)execute()、(b)executeQuery()、および(c)executeUpdate()と対話するための* Statementオブジェクト*メソッドはすべて、PreparedStatementオブジェクトでも機能します。 ただし、メソッドは、パラメーターを入力できるSQLステートメントを使用するように変更されます。
PreparedStatementオブジェクトを閉じる
Statementオブジェクトを閉じるのと同じ理由で、PreparedStatementオブジェクトも閉じる必要があります。
close()メソッドを単純に呼び出すと、ジョブが実行されます。 最初にConnectionオブジェクトを閉じると、PreparedStatementオブジェクトも閉じます。 ただし、適切にクリーンアップするために、PreparedStatementオブジェクトを常に明示的に閉じる必要があります。
PreparedStatement pstmt = null;
try {
String SQL = "Update Employees SET age = ? WHERE id = ?";
pstmt = conn.prepareStatement(SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
pstmt.close();
}
よりよく理解するために、link:/jdbc/preparestatement-object-example [Prepare-Example Code]を調べてみましょう。
CallableStatementオブジェクト
ConnectionオブジェクトがStatementおよびPreparedStatementオブジェクトを作成するように、CallableStatementオブジェクトも作成します。これは、データベースストアドプロシージャの呼び出しを実行するために使用されます。
CallableStatementオブジェクトの作成
あなたが次のOracleストアドプロシージャを実行する必要があると仮定します-
CREATE OR REPLACE PROCEDURE getEmpName
(EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
SELECT first INTO EMP_FIRST
FROM Employees
WHERE ID = EMP_ID;
END;
- 注:*上記のストアドプロシージャはOracle向けに記述されていますが、MySQLデータベースを使用しているため、次のようにMySQLに対して同じストアドプロシージャを記述してEMPデータベースに作成します-
DELIMITER $$
DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName`
(IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
SELECT first INTO EMP_FIRST
FROM Employees
WHERE ID = EMP_ID;
END $$
DELIMITER ;
パラメーターには、IN、OUT、およびINOUTの3つのタイプがあります。 PreparedStatementオブジェクトは、INパラメーターのみを使用します。 CallableStatementオブジェクトは3つすべてを使用できます。
ここにそれぞれの定義があります-
Parameter | Description |
---|---|
IN | A parameter whose value is unknown when the SQL statement is created. You bind values to IN parameters with the setXXX() methods. |
OUT | A parameter whose value is supplied by the SQL statement it returns. You retrieve values from theOUT parameters with the getXXX() methods. |
INOUT | A parameter that provides both input and output values. You bind variables with the setXXX() methods and retrieve values with the getXXX() methods. |
次のコードスニペットは、* Connection.prepareCall()メソッドを使用して、前述のストアドプロシージャに基づいて *CallableStatement オブジェクトをインスタンス化する方法を示しています-
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall (SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}
文字列変数SQLは、パラメータープレースホルダーを持つストアドプロシージャを表します。
CallableStatementオブジェクトの使用は、PreparedStatementオブジェクトの使用によく似ています。 ステートメントを実行する前に、すべてのパラメーターに値をバインドする必要があります。そうしないと、SQLExceptionが発生します。
INパラメーターがある場合は、PreparedStatementオブジェクトに適用されるものと同じ規則と手法に従ってください。バインドしているJavaデータ型に対応するsetXXX()メソッドを使用します。
OUTおよびINOUTパラメーターを使用する場合、追加のCallableStatementメソッドregisterOutParameter()を使用する必要があります。 registerOutParameter()メソッドは、JDBCデータ型を、ストアドプロシージャが返すと予想されるデータ型にバインドします。
ストアドプロシージャを呼び出すと、適切なgetXXX()メソッドを使用してOUTパラメーターから値を取得します。 このメソッドは、取得したSQL型の値をJavaデータ型にキャストします。
CallableStatementオブジェクトを閉じる
他のStatementオブジェクトを閉じるのと同じように、同じ理由でCallableStatementオブジェクトも閉じる必要があります。
close()メソッドを単純に呼び出すと、ジョブが実行されます。 最初にConnectionオブジェクトを閉じると、CallableStatementオブジェクトも閉じます。 ただし、適切にクリーンアップされるように、CallableStatementオブジェクトを常に明示的に閉じる必要があります。
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall (SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
cstmt.close();
}
よりよく理解するために、link:/jdbc/callablestatement-object-example [Callable-Example Code]を研究することをお勧めします。