English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JDBC Statement、PreparedStatement、CallableStatement

接続が取得されると、データベースと対話できます。JDBC Statement、CallableStatement、PreparedStatement インターフェースは、SQLやPL/SQLコマンドを実行し、データベースからデータを受信します。

データベースで使用されるJavaとSQLデータ型のデータ型の違いを埋めるのに役立つ方法を定義しています。

以下の表は、各インターフェースの用途をまとめ、使用するインターフェースを決定するためのものです。

インターフェース
推奨
Statement

データベースへの一般的なアクセスに使用してください。ランタイムで静的SQL ステートメントを使用する場合に非常に役立ちます。Statement インターフェースはパラメータを受け取れません。

PreparedStatement

SQL ステートメントを複数回使用する計画がある場合、このオプションを使用してください。PreparedStatement インターフェースは、ランタイムで入力パラメータを受け取ります。

CallableStatement

データベースのストレージプロシージャにアクセスする場合、このオプションを使用してください。CallableStatement インターフェースは、ランタイムで入力パラメータを受け取ることもできます。

Statement オブジェクト

Statement オブジェクトの作成

Statement オブジェクトを使用してSQL ステートメントを実行する前に、Connection オブジェクトの createStatement() メソッドを使用してSQL ステートメントを作成する必要があります。以下の例を参照してください。-

Statement stmt = null;
try {
   stmt = conn.createStatement();
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Statement オブジェクトが作成されたら、その中の1つの実行メソッドを使用してSQL ステートメントを実行できます。

  • boolean execute(String SQL):ResultSet オブジェクトを取得できる場合は true を、できない場合は false を返します。実際の動的SQLを使用する場合、このメソッドを使用してSQL DDL ステートメントを実行します。

  • int executeUpdate(String SQL):SQL ステートメントの実行に影響を与えた行数を返します。INSERT、UPDATE、DELETE ステートメントなどの行数を影響したいSQL ステートメントを実行するために、このメソッドを使用します。

  • ResultSet executeQuery(String SQL):ResultSet オブジェクトを返します。結果セットを取得したい場合、このメソッドを使用してください。SELECT ステートメントのように使用します。

Statement オブジェクトを閉じる

Connection オブジェクトを閉じることでデータベースリソースを節約するように、同じ理由でStatement オブジェクトも閉じるべきです。

close() メソッドを簡単に呼び出すだけで十分です。Connection オブジェクトを最初に閉じると、Statement オブジェクトも閉じられますが、常にStatement オブジェクトを明示的に閉じることを推奨します。これにより、正しくクリーンアップできます。

Statement stmt = null;
try {
   stmt = conn.createStatement();
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

よりよく理解するために、学習をお勧めしますStatement 示例教程

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()メソッドは値をパラメータにバインドし、XXXJavaデータ型を希望するバインドする入力パラメータの値を表します。値を提供しない場合、SQLExceptionが発生します。

各パラメータタグはその順序位置で参照されます。最初のタグは位置を表します。1第2引数を表します。2などと続き、このメソッドはJavaの配列インデックスメソッドとは異なり、后者は0から始まります。

データベースとのインタラクションに使用されるすべての Statement オブジェクトのメソッド(a)execute()、(b)executeQuery()、および(c)executeUpdate()も 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();
}

よりよく理解するために、以下を学びましょう「PreparedStatement の例コード

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;

NOTE: 上記のストレージプロシージャは 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 ;

存在するパラメータの種類は 3 種です: IN、OUT、および INOUT。PreparedStatement オブジェクトは IN パラメータのみを使用します。CallableStatement オブジェクトはこれらすべての 3 種を使用できます。

これは各の定義です-

範囲説明
IN

SQL ステートメントを作成する際に値がまだ不明のパラメータです。setXXX() メソッドを使用して値を IN something にバインドします。

OUT

値は返される SQL 文で提供されたパラメータによって指定されます。getXXX() メソッドを使用してパラメータから値を検索します。

INOUT

入力および出力値のパラメータを同時に提供します。setXXX() メソッドを使用して変数をバインドし、getXXX() メソッドを使用して値を取得できます。

以下のコードスニペットは、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();
}

より良い理解を得るために、学習することをお勧めしますCallableStatement 示例コード