【新人エンジニア向け】

こんにちは。ゆうせいです。

今回は、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 driverJDBCドライバがないmysql-connector-java をクラスパスに追加する
結果が取得できないOUTパラメータ未設定registerOutParameter() を使う

まとめ

項目内容
呼び出し方法CallableStatement を使用
入力パラメータsetString, setInt などで指定
出力パラメータregisterOutParameter + getInt 等で取得
書式"{CALL プロシージャ名(?, ?, ?)}" のように記述

今後の学習の指針

  • IN, OUT, INOUT の3種類のパラメータを使い分けてみよう
  • 複数の結果セットを返すストアドプロシージャを試してみよう
  • トランザクション処理とストアドプロシージャの連携も練習してみよう
  • JavaのORM(MyBatisやJPA)でのストアドプロシージャ呼び出しも学んでみよう!

Java×MySQLの連携力がつけば、業務システムの基礎がぐっと固まります!

最後までお読みいただきありがとうございます。