MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

JDBCのCallableStatementとは何ですか?


CallableStatement インターフェイスは、ストアドプロシージャを実行するためのメソッドを提供します。 JDBC APIはストアドプロシージャのSQLエスケープ構文を提供するため、すべてのRDBMSのストアドプロシージャを単一の標準的な方法で呼び出すことができます。

CallableStatementの作成

CallableStatementのオブジェクトを作成できます (インターフェース) prepareCall()を使用する 接続の方法 インターフェース。このメソッドは、ストアドプロシージャを呼び出すクエリを表す文字列変数を受け入れ、 CallableStatementを返します。 オブジェクト。

Callableステートメントには、入力パラメーター、出力パラメーター、またはその両方を含めることができます。入力パラメーターをプロシージャー呼び出しに渡すには、プレースホルダーを使用し、CallableStatementインターフェースによって提供されるsetterメソッド(setInt()、setString()、setFloat())を使用してこれらに値を設定できます。

データベースにmyProcedureという名前のプロシージャがあり、次のように呼び出し可能なステートメントを準備できるとします。

//Preparing a CallableStatement
CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");

入力パラメータへの値の設定

セッターメソッドを使用して、プロシージャ呼び出しの入力パラメータに値を設定できます。

これらは2つの引数を受け入れます。1つは入力パラメータの配置インデックスを表す整数値で、もう1つはintまたは、Stringまたはfloatなどです。入力パラメータとしてプロシージャに渡す必要のある値を表します。

注: インデックスの代わりに、パラメータの名前を文字列形式で渡すこともできます。

cstmt.setString(1, "Raghav");
cstmt.setInt(2, 3000);
cstmt.setString(3, "Hyderabad");

呼び出し可能ステートメントの実行

CallableStatementオブジェクトを作成したら、 execute()のいずれかを使用して実行できます。 メソッド。

cstmt.execute();

従業員という名前のテーブルがあるとします。 次のデータを含むMySQLデータベース内:

+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+

そして、以下に示すように、このテーブルに値を挿入するmyProcedureという名前のプロシージャを作成しました。

Create procedure myProcedure (IN name VARCHAR(30), IN sal INT, IN loc VARCHAR(45))
   -> BEGIN
   -> INSERT INTO Employee(Name, Salary, Location) VALUES (name, sal, loc);
   -> END //

以下は、呼び出し可能なステートメントを使用して、上記で作成したプロシージャを呼び出すことにより、Employeeテーブルに新しいレコードを挿入するJDBCの例です。

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CallableStatementExample {
   public static void main(String args[]) throws SQLException {
      //Registering the Driver
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());

      //Getting the connection
      String mysqlUrl = "jdbc:mysql://localhost/testdb";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //Preparing a CallableStateement
      CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");

      cstmt.setString(1, "Raghav");
      cstmt.setInt(2, 3000);
      cstmt.setString(3, "Hyderabad");

      cstmt.setString(1, "Kalyan");
      cstmt.setInt(2, 4000);
      cstmt.setString(3, "Vishakhapatnam");

      cstmt.setString(1, "Rukmini");
      cstmt.setInt(2, 5000);
      cstmt.setString(3, "Delhi");

      cstmt.setString(1, "Archana");
      cstmt.setInt(2, 15000);
      cstmt.setString(3, "Mumbai");

      cstmt.execute();
      System.out.println("Rows inserted ....");
   }
}

出力

Connection established......
Rows inserted ....

selectクエリを使用してEmployeeテーブルの内容を取得すると、以下に示すように、新しく追加されたレコードを確認できます。

mysql> select * from employee;
+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
| Raghav  | 3000   | Hyderabad      |
| Raghav  | 3000   | Hyderabad      |
| Kalyan  | 4000   | Vishakhapatnam |
| Rukmini | 5000   | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+
9 rows in set (0.00 sec)
>
  1. MySQL JDBCドライバー接続文字列とは何ですか?

    MySQLJDBC接続文字列は次のようになります- Class.forName(com.mysql.jdbc.Driver); 上記では、ドライバーはインターフェースです。 JDBCがアプリケーションサーバーの外部で実行されている場合は常に、クラスDriverManagerが接続を確立します。 DriverManagerクラスは次のとおりです- conn = (Connection) DriverManager.getConnection(jdbc:mysql://localhost/yourdatabaseName,”yourRootName,yourPassword); ここ

  2. JDBCの結果とは何ですか? ResultSetオブジェクトからデータを取得する方法は?

    ResultSet JDBCのインターフェースは、SQLクエリによって生成された表形式のデータを表します。現在の行を指すカーソルがあります。最初、このカーソルは最初の行の前に置かれます。 結果セット全体でポインタを移動する next() ResultSetインターフェースのメソッド 現在の(ResultSet)オブジェクトのポインタを現在の位置から次の行に移動します。このメソッドはブール値を返します。現在の位置の横に行がない場合はfalseを返し、そうでない場合はtrueを返します。したがって、whileループでこのメソッドを使用すると、結果セットの内容を繰り返すことができます。