📜  Java如何使用Callable语句调用存储过程?(1)

📅  最后修改于: 2023-12-03 15:16:35.047000             🧑  作者: Mango

Java如何使用Callable语句调用存储过程?

在Java中,我们可以使用JDBC来连接数据库和执行SQL语句。而对于存储过程(Stored Procedure)的调用,我们可以使用JDBC中的CallableStatement来实现。

CallableStatement介绍

CallableStatement是一个继承自PreparedStatement的接口,它可以处理存储过程和函数的调用。它有以下特点:

  • 可以返回多个结果集(ResultSet);
  • 可以设置参数的输入和输出;
  • 可以使用registerOutParameter()注册输出参数。
使用CallableStatement调用存储过程

假设我们有一个存储过程"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来操作数据库,并调用存储过程来实现更复杂的业务逻辑。