Java中调用存储过程的核心是CallableStatement,需加载驱动、用{call proc(?)}语法准备语句,setXxx设输入参数,registerOutParameter注册输出参数,execute后用getXXX获取结果。

Java 中用 JDBC 执行存储过程,核心是使用 CallableStatement,而不是普通的 PreparedStatement 或 Statement。它专为调用数据库存储过程(含输入、输出、输入输出参数)设计。
1. 准备工作:加载驱动并获取连接
确保已添加对应数据库的 JDBC 驱动(如 MySQL 的 mysql-connector-java、Oracle 的 ojdbc8),并用标准方式建立连接:
例如 MySQL:
String url = "jdbc:mysql://localhost:3306/testdb"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password);
2. 编写 CallableStatement SQL 语句
语法需遵循数据库规范,常见格式为:
- MySQL:
{call procedure_name(?, ?, ?)}或{? = call function_name(?)} - SQL Server:
{call proc_name(?, ?)}或{? = call func_name(?)} - Oracle:
{call proc_name(?, ?)}(包内过程)或{? = call func_name(?)}
注意:问号 ? 占位符顺序必须与存储过程中参数声明顺序严格一致。
3. 设置参数并执行
以 MySQL 存储过程为例(假设有一个带输入和输出参数的过程):
-- 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 ;
Java 调用代码:
String sql = "{call get_user_by_id(?, ?)}";
CallableStatement cs = conn.prepareCall(sql);
<p>cs.setInt(1, 1001); // 输入参数:id = 1001
cs.registerOutParameter(2, Types.VARCHAR); // 注册第2个参数为输出,类型为 VARCHAR</p><p>cs.execute();</p><p>String name = cs.getString(2); // 获取输出参数值
System.out.println("用户名:" + name);</p>关键点:
-
setXxx(index, value)设置输入参数(索引从 1 开始) -
registerOutParameter(index, sqlType)必须在execute()前注册输出参数类型 -
getXXX(index)在执行后读取输出参数(如getString、getInt)
4. 处理带返回值的函数(ResultSet 或标量)
如果存储过程返回结果集(如 SELECT 查询),用 execute() 后调用 getResultSet();如果是函数返回标量值,用 {? = call func(...)} 形式,并注册第一个参数为 OUT:
// 调用返回单个值的函数
String sqlFunc = "{? = call count_users()}";
CallableStatement csFunc = conn.prepareCall(sqlFunc);
csFunc.registerOutParameter(1, Types.INTEGER);
csFunc.execute();
int total = csFunc.getInt(1);
若过程返回多个结果集(如 SQL Server 中多个 SELECT),可用 getMoreResults() 循环获取。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











