今回は、MySQLのストアドプロシージャ(Stored Procedure)をJavaから使う方法を、初めてでもわかるように解説していきます。
「SQLの中に処理をまとめて書いたストアドプロシージャって、Javaでどうやって呼び出すの?」
「引数を渡したり、結果を受け取ったりできるの?」
そんな疑問を持つあなたに、サンプルコード付きでしっかり説明します!
まずは基礎から:ストアドプロシージャとは?
- MySQLに保存された一連の処理(SQL文のかたまり)
 - 事前に定義しておくことで、Java側では 
CALL プロシージャ名()のように呼び出すだけ - 引数を渡したり、結果を返したりも可能
 
今回の目標
以下のようなストアドプロシージャをJavaから呼び出してみましょう。
CREATE PROCEDURE insert_employee (
  IN emp_name VARCHAR(50),
  IN emp_dept VARCHAR(50)
)
BEGIN
  INSERT INTO employees (name, department)
  VALUES (emp_name, emp_dept);
END;
必要な準備
- Java 開発環境(JDK, IDE)
 - MySQL がインストール済み
 - JDBCドライバ(
mysql-connector-java) employeesテーブルが存在すること
CREATE TABLE employees (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  department VARCHAR(50)
);
Javaからストアドプロシージャを呼び出す方法
ステップ①:JDBC接続を作成
String url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=Asia/Tokyo";
String user = "your_user";
String password = "your_password";
ステップ②:CallableStatement を使ってプロシージャを呼び出す
import java.sql.*;
public class CallStoredProcedure {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/sample_db?serverTimezone=Asia/Tokyo";
        String user = "newuser";
        String password = "0";
        try (Connection con = DriverManager.getConnection(url, user, password)) {
            // ストアドプロシージャの呼び出し文(?はプレースホルダ)
            String callSql = "{CALL insert_employee(?, ?)}";
            CallableStatement cs = con.prepareCall(callSql);
            // 引数を設定
            cs.setString(1, "佐藤一郎");
            cs.setString(2, "開発部");
            // 実行
            cs.execute();
            System.out.println("ストアドプロシージャを実行しました。");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
出力があるストアドプロシージャもOK!
たとえば次のような、戻り値付きのプロシージャにも対応できます。
SQL側(OUTパラメータあり)
CREATE PROCEDURE count_employees (
  OUT emp_count INT
)
BEGIN
  SELECT COUNT(*) INTO emp_count FROM employees;
END;
Java側
String sql = "{CALL count_employees(?)}";
CallableStatement cs = con.prepareCall(sql);
// OUTパラメータを登録(引数の順番、型)
cs.registerOutParameter(1, Types.INTEGER);
// 実行
cs.execute();
// OUT値を取得
int count = cs.getInt(1);
System.out.println("社員数: " + count);
よくあるつまずきポイント
| 問題 | 原因 | 解決法 | 
|---|---|---|
Procedure does not exist | プロシージャが定義されていない | MySQL側に正しく作成したか確認 | 
Syntax error or access violation | 引数の数や型が違う | JavaとMySQL側で引数の順番・型を一致させる | 
No suitable driver | JDBCドライバがない | mysql-connector-java をクラスパスに追加する | 
| 結果が取得できない | OUTパラメータ未設定 | registerOutParameter() を使う | 
まとめ
| 項目 | 内容 | 
|---|---|
| 呼び出し方法 | CallableStatement を使用 | 
| 入力パラメータ | setString, setInt などで指定 | 
| 出力パラメータ | registerOutParameter + getInt 等で取得 | 
| 書式 | "{CALL プロシージャ名(?, ?, ?)}" のように記述 | 
今後の学習の指針
- IN, OUT, INOUT の3種類のパラメータを使い分けてみよう
 - 複数の結果セットを返すストアドプロシージャを試してみよう
 - トランザクション処理とストアドプロシージャの連携も練習してみよう
 - JavaのORM(MyBatisやJPA)でのストアドプロシージャ呼び出しも学んでみよう!
 
Java×MySQLの連携力がつけば、業務システムの基礎がぐっと固まります!