📅  最后修改于: 2023-12-03 15:16:35.047000             🧑  作者: Mango
在Java中,我们可以使用JDBC来连接数据库和执行SQL语句。而对于存储过程(Stored Procedure)的调用,我们可以使用JDBC中的CallableStatement来实现。
CallableStatement是一个继承自PreparedStatement的接口,它可以处理存储过程和函数的调用。它有以下特点:
假设我们有一个存储过程"get_employee",它包含两个输入参数"p_emp_id"和"p_dept_id",一个输出参数"p_salary",以及返回一个"employee"表的结果集。我们可以使用以下Java代码来调用这个存储过程:
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Types;
public class CallableStatementExample {
public static void main(String[] args) {
String dbURL = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(dbURL, user, password)) {
String sql = "{CALL get_employee(?, ?, ?)}";
CallableStatement stmt = conn.prepareCall(sql);
// 设置输入参数
stmt.setInt(1, 1001);
stmt.setInt(2, 10);
// 注册输出参数
stmt.registerOutParameter(3, Types.FLOAT);
// 执行存储过程
stmt.execute();
// 获取输出参数
float salary = stmt.getFloat(3);
System.out.println("Salary for employee 1001 in department 10 is " + salary);
// 处理结果集
ResultSet rs = stmt.getResultSet();
while (rs.next()) {
int empId = rs.getInt("emp_id");
String firstName = rs.getString("first_name");
String lastName = rs.getString("last_name");
String email = rs.getString("email");
float salary = rs.getFloat("salary");
System.out.println(empId + ", " + firstName + ", " + lastName + ", " + email + ", " + salary);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
在这个例子中,我们首先建立了一个数据库连接,然后准备了一个CallableStatement,并将存储过程的调用语句"{CALL get_employee(?, ?, ?)}"作为参数。我们接着设置输入参数"p_emp_id"和"p_dept_id"的值,注册输出参数"p_salary"的类型,并执行存储过程。
当存储过程执行完毕后,我们可以通过getFloat()方法获取输出参数"p_salary"的值,并通过getResultSet()方法获取结果集(如果有的话)。在本例中,我们打印出了查询结果集的每一行。
使用CallableStatement调用存储过程是一个非常方便的方法。它不仅可以处理输入输出参数,还可以获取多个结果集。在Java中,我们可以很方便地使用JDBC来操作数据库,并调用存储过程来实现更复杂的业务逻辑。