Java中调用MySQL存储过程需用CallableStatement,核心是正确注册参数类型、设置输入输出参数,并按{CALL proc_name(?, ?)}格式写调用语句;先setInt()设输入参数,再registerOutParameter()注册输出参数,execute()后用getString()获取结果。

Java 中用 CallableStatement 调用 MySQL 存储过程,核心是正确注册参数类型、设置输入输出参数,并按 MySQL 的语法格式写调用语句(如 {CALL proc_name(?, ?)})。
准备 MySQL 存储过程
确保数据库中已有可执行的存储过程。例如创建一个带输入和输出参数的简单过程:
DELIMITER $$
CREATE PROCEDURE get_user_by_id(IN uid INT, OUT uname VARCHAR(50))
BEGIN
SELECT name INTO uname FROM users WHERE id = uid;
END$$
DELIMITER ;
注意:
- 使用 IN 表示输入参数,OUT 或 INOUT 表示输出或双向参数;
- MySQL 8+ 默认开启 allowMultiQueries=false,无需额外配置;
- 确保连接 URL 启用预处理支持(通常默认开启,无需改动)。
加载驱动并获取连接
使用标准 JDBC 流程获取连接(推荐使用 DriverManager 或连接池):
- MySQL Connector/J 8.x 驱动类名为
com.mysql.cj.jdbc.Driver(新版本自动注册,可省略Class.forName()); - 连接 URL 示例:
jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC; - 确保用户名密码正确,且该用户有执行存储过程的权限(
EXECUTE权限)。
用 CallableStatement 设置并执行调用
调用时需注意占位符顺序、参数类型匹配和输出参数注册:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
String sql = "{CALL get_user_by_id(?, ?)}";
try (Connection conn = DriverManager.getConnection(url, user, pwd);
CallableStatement cs = conn.prepareCall(sql)) {
<pre class="brush:php;toolbar:false;">// 设置输入参数(索引从 1 开始)
cs.setInt(1, 101);
// 注册输出参数(必须在 execute 前注册)
cs.registerOutParameter(2, Types.VARCHAR);
// 执行(对存储过程用 execute,不是 executeQuery 或 executeUpdate)
cs.execute();
// 获取输出参数值
String name = cs.getString(2);
System.out.println("User name: " + name);}
- 调用语法必须用花括号包裹:
{CALL proc_name(?, ...)},这是 JDBC 标准语法; -
registerOutParameter()必须在execute()之前调用,否则抛异常; - 参数索引从 1 开始,和 SQL 中问号位置严格对应;
- 输出参数类型要与存储过程中定义的类型一致(如
VARCHAR对应OUT uname VARCHAR(50))。
处理 INOUT 参数和结果集
若存储过程返回结果集(如 SELECT 语句),可用 getResultSet() 获取;若含 INOUT 参数,需先设值再注册:
- 对于
INOUT参数:先用setXxx()设初始值,再用registerOutParameter()注册; - 若有结果集:调用
execute()后,用cs.getResultSet()获取并遍历; - 多个结果集或更新计数?MySQL 存储过程一般只返回一个结果集,复杂场景建议用
execute()+ 循环检查getMoreResults()。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










