java 如何调用存储过程
调用存储过程的基本步骤
在Java中调用数据库存储过程通常使用JDBC(Java Database Connectivity)API。以下是详细的操作步骤:
准备JDBC连接 确保已加载数据库驱动并建立连接。以MySQL为例:
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/dbname", "username", "password");
创建CallableStatement对象
使用prepareCall方法定义存储过程调用语法。参数用?占位:
CallableStatement cstmt = conn.prepareCall("{call procedure_name(?, ?)}");
设置输入参数
通过setXXX方法设置输入参数,根据参数数据类型选择对应方法:

cstmt.setString(1, "input_value"); // 第一个参数为String类型
cstmt.setInt(2, 100); // 第二个参数为int类型
注册输出参数
使用registerOutParameter指定输出参数的位置和类型:
cstmt.registerOutParameter(2, Types.INTEGER); // 第二个参数为输出参数
执行存储过程
调用execute或executeUpdate方法执行:
boolean hasResults = cstmt.execute();
处理返回结果
对于有结果集的存储过程:

if (hasResults) {
ResultSet rs = cstmt.getResultSet();
while (rs.next()) {
// 处理结果集数据
}
}
获取输出参数值:
int outputValue = cstmt.getInt(2);
完整示例代码
以下是一个调用MySQL存储过程的完整示例:
try {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "user", "pass");
CallableStatement cstmt = conn.prepareCall("{call get_employee(?, ?)}");
cstmt.setInt(1, 101); // 设置员工ID输入参数
cstmt.registerOutParameter(2, Types.VARCHAR); // 注册姓名输出参数
cstmt.execute();
String employeeName = cstmt.getString(2);
System.out.println("Employee name: " + employeeName);
} catch (SQLException e) {
e.printStackTrace();
}
注意事项
- 不同数据库的存储过程调用语法可能略有差异
- Oracle需要使用
{call procedure_name(?)}语法 - SQL Server可能需要在参数前加
@符号 - 始终在finally块中关闭连接和语句对象
- 考虑使用try-with-resources语句自动管理资源
使用命名参数(JDBC 4.2+)
新版JDBC支持命名参数,提高代码可读性:
CallableStatement cstmt = conn.prepareCall("{call proc(:param1, :param2)}");
cstmt.setString("param1", "value");
cstmt.registerOutParameter("param2", Types.INTEGER);






