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