Java 调用 MySQL 存储过程
在 Java 中调用 MySQL 存储过程可以通过 JDBC 实现,下面我将介绍几种常见的方法和示例代码。

(图片来源网络,侵删)
准备工作
首先确保你已经:
- 添加了 MySQL JDBC 驱动依赖(如
mysql-connector-java) - 建立了数据库连接
调用无参数的存储过程
import java.sql.*;
public class CallStoredProcedureExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database";
String user = "username";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 调用存储过程
CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure()}");
// 执行存储过程
cstmt.execute();
// 如果存储过程有结果集,可以获取
ResultSet rs = cstmt.getResultSet();
while (rs.next()) {
// 处理结果集
System.out.println(rs.getString("column_name"));
}
rs.close();
cstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
调用带参数的存储过程
1 IN 参数
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 调用带IN参数的存储过程
CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure(?)}");
// 设置IN参数
cstmt.setInt(1, 100); // 假设第一个参数是整数类型
// 执行存储过程
cstmt.execute();
// 处理结果(如果有)
// ...
} catch (SQLException e) {
e.printStackTrace();
}
2 OUT 参数
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 调用带OUT参数的存储过程
CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure(?, ?)}");
// 设置IN参数
cstmt.setInt(1, 100);
// 注册OUT参数
cstmt.registerOutParameter(2, Types.INTEGER); // 假设第二个参数是整数类型
// 执行存储过程
cstmt.execute();
// 获取OUT参数的值
int result = cstmt.getInt(2);
System.out.println("Result: " + result);
// 处理结果(如果有)
// ...
} catch (SQLException e) {
e.printStackTrace();
}
3 INOUT 参数
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 调用带INOUT参数的存储过程
CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure(?)}");
// 设置INOUT参数的初始值
cstmt.setInt(1, 100);
// 注册INOUT参数
cstmt.registerOutParameter(1, Types.INTEGER);
// 执行存储过程
cstmt.execute();
// 获取INOUT参数的返回值
int result = cstmt.getInt(1);
System.out.println("Result: " + result);
// 处理结果(如果有)
// ...
} catch (SQLException e) {
e.printStackTrace();
}
处理多个结果集
如果存储过程返回多个结果集,可以使用以下方式:
try (Connection conn = DriverManager.getConnection(url, user, password)) {
CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure()}");
boolean hasResult = cstmt.execute();
while (hasResult) {
ResultSet rs = cstmt.getResultSet();
while (rs.next()) {
// 处理当前结果集
System.out.println(rs.getString("column_name"));
}
rs.close();
// 检查是否有更多结果集
hasResult = cstmt.getMoreResults();
}
cstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
使用 Spring Data 调用存储过程
如果你使用 Spring Boot,可以更简单地调用存储过程:
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public Map<String, Object> callStoredProcedure() {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName("your_schema")
.withProcedureName("your_storedProcedure")
.declareParameters(
new SqlParameter("in_param", Types.INTEGER),
new SqlOutParameter("out_param", Types.INTEGER)
);
Map<String, Object> inParams = new HashMap<>();
inParams.put("in_param", 100);
return jdbcCall.execute(inParams);
}
}
注意事项
- 确保存储过程在数据库中已存在
- 参数索引从1开始,不是0
- 对于OUT参数,必须先注册才能获取值
- 处理完所有结果集和参数后,记得关闭CallableStatement
- 考虑使用连接池(如HikariCP)提高性能
希望这些示例能帮助你在Java中成功调用MySQL存储过程!

(图片来源网络,侵删)
