【新人エンジニア向け】
こんにちは。ゆうせいです。
今回は、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の連携力がつけば、業務システムの基礎がぐっと固まります!