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

JDBCのCallableStatementとは?ストアドプロシージャの呼び出し方を解説

CallableStatementインターフェースは、ストアドプロシージャ(Stored Procedure)を実行するためのメソッドを提供します。JDBC APIにはストアドプロシージャ用のSQLエスケープ構文が標準で用意されているため、RDBMSの種類に関係なく、共通の標準的な方法ですべてのストアドプロシージャを呼び出すことができます。

CallableStatementオブジェクトの作成

CallableStatementのオブジェクトは、ConnectionインターフェースのprepareCall()メソッドを使って生成します。このメソッドは、ストアドプロシージャを呼び出すSQL文を表す文字列を引数として受け取り、CallableStatementオブジェクトを返します。

CallableStatementには、入力パラメータ・出力パラメータ、あるいはその両方を含めることができます。入力パラメータを渡す場合は、プレースホルダー「?」を配置し、CallableStatementインターフェースが提供するセッターメソッド(setInt()、setString()、setFloat()など)で値をバインドします。

例えば、データベースに「myProcedure」という名前のプロシージャが存在する場合、次のようにCallableStatementを準備できます。

// CallableStatementの準備
CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");

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

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

セッターメソッドは2つの引数を取ります。第1引数は対象のパラメータの位置(インデックス)を示す整数値、第2引数はintやString、floatなど、プロシージャに渡したい実際の値です。

補足: インデックス番号の代わりに、String形式でパラメータ名を指定することも可能です。

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

CallableStatementの実行

CallableStatementオブジェクトの準備ができたら、execute()メソッドを呼び出して実行します。

cstmt.execute();

サンプルプログラム

ここでは、MySQLデータベースに以下のデータを持つEmployeeテーブルが存在するものとします。

+---------+--------+----------------+
| 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 //

以下は、CallableStatementを使って上記のプロシージャを呼び出し、Employeeテーブルに新しいレコードを挿入するJDBCのサンプルコードです。パラメータ値を設定するたびにexecute()を呼び出すことで、複数行を連続して挿入できます。

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 {
        // ドライバの登録
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());

        // データベースへの接続
        String mysqlUrl = "jdbc:mysql://localhost/testdb";
        Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
        System.out.println("Connection established......");

        // CallableStatementの準備
        CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");

        // 1件目のデータを設定して実行
        cstmt.setString(1, "Raghav");
        cstmt.setInt(2, 3000);
        cstmt.setString(3, "Hyderabad");
        cstmt.execute();

        // 2件目のデータを設定して実行
        cstmt.setString(1, "Kalyan");
        cstmt.setInt(2, 4000);
        cstmt.setString(3, "Vishakhapatnam");
        cstmt.execute();

        // 3件目のデータを設定して実行
        cstmt.setString(1, "Rukmini");
        cstmt.setInt(2, 5000);
        cstmt.setString(3, "Delhi");
        cstmt.execute();

        // 4件目のデータを設定して実行
        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テーブルの内容を確認すると、新しく追加された4件のレコードを確認できます。

mysql> select * from employee;
+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
| Raghav  | 3000   | Hyderabad      |
| Kalyan  | 4000   | Vishakhapatnam |
| Rukmini | 5000   | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+
8 rows in set (0.00 sec)

  1. MySQL JDBCドライバーの接続文字列とは?書き方と使い方を解説

    MySQL JDBCドライバーの接続文字列とはJavaからMySQLデータベースへ接続する際に必要となるのが「JDBC接続文字列」です。まず、MySQLのJDBCドライバーを読み込むためのコードは以下のようになります。Class.forName(com.mysql.jdbc.Driver);ここで指定している Driver はインターフェースであり、このクラスをロードすることでMySQL用のJDBCドライバーが利用可能になります。なお、新しいMySQL Connector/J(バージョン8.0以降)では、ドライバークラス名が com.mysql.cj.jdbc.Driver に変更されている点

  2. JDBCのResultSetとは?ResultSetオブジェクトからデータを取得する方法を徹底解説

    JDBCにおけるResultSetインターフェースは、SQLクエリを実行した結果として生成される表形式(テーブル形式)のデータを表現するためのものです。ResultSetは現在の行を指し示す「カーソル」を持っており、初期状態では、このカーソルは最初の行の直前に位置しています。カーソルを移動して結果セットを走査するResultSetインターフェースが提供するnext()メソッドを使うと、現在のカーソル位置から次の行へとポインタを移動できます。このメソッドはboolean値を返し、次の行が存在すればtrue、現在位置以降にこれ以上の行がない場合はfalseを返します。そのため、whileループの中