JDBC中的CallableStatement是什么?

CallableStatement接口提供的方法来执行该存储过程。由于JDBC API提供了存储过程SQL转义语法,因此您可以以单一标准方式调用所有RDBMS的存储过程。

创建一个CallableStatement

您可以使用Connection接口的prepareCall()方法创建CallableStatement(接口)的对象。此方法接受表示查询的字符串变量来调用存储过程,并返回CallableStatement对象。

Callable语句可以具有输入参数,输出参数或两者都有。要将输入参数传递给过程调用,您可以使用占位符,并使用CallableStatement接口提供的setter方法(setInt()setString(),,setFloat())为这些参数设置值。

假设您在数据库中有一个过程名称myProcedure,则可以将可调用语句准备为:

//Preparing a CallableStatement
CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");

设置输入参数的值

您可以使用setter方法将值设置为过程调用的输入参数。

它们接受两个参数,一个是表示输入参数的放置索引的整数值,另一个是int或String或float等…表示需要作为输入参数传递给过程的值。

注意:除了索引以外,您还可以使用String格式传递参数名称。

cstmt.setString(1, "Raghav");
cstmt.setInt(2, 3000);
cstmt.setString(3, "Hyderabad");

执行可调用语句

创建CallableStatement对象后,可以使用execute()方法之一执行它。

cstmt.execute();

示例

假设我们在MySQL数据库中有一个名为Employee的表,其中包含以下数据:

+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+

我们创建了一个名为myProcedure的过程,将值插入到该表中,如下所示:

Create procedure myProcedure (IN name VARCHAR(30), IN sal INT, IN loc VARCHAR(45))
   -> BEGIN
   -> INSERT INTO Employee(Name, Salary, Location) VALUES (name, sal, loc);
   -> END //

以下是一个JDBC示例,该示例使用可调用语句通过调用上述创建的过程将新记录插入Employee表。

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CallableStatementExample {
   public static void main(String args[]) throws SQLException {
      //注册驱动程序
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());

      //获得连接
      String mysqlUrl = "jdbc:mysql://localhost/testdb";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //准备一个CallableStatement-
      CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");

      cstmt.setString(1, "Raghav");
      cstmt.setInt(2, 3000);
      cstmt.setString(3, "Hyderabad");

      cstmt.setString(1, "Kalyan");
      cstmt.setInt(2, 4000);
      cstmt.setString(3, "Vishakhapatnam");

      cstmt.setString(1, "Rukmini");
      cstmt.setInt(2, 5000);
      cstmt.setString(3, "Delhi");

      cstmt.setString(1, "Archana");
      cstmt.setInt(2, 15000);
      cstmt.setString(3, "Mumbai");

      cstmt.execute();
      System.out.println("Rows inserted ....");
   }
}

输出结果

Connection established......
Rows inserted ....

如果使用选择查询检索Employee表的内容,则可以观察到新添加的记录,如下所示:

mysql> select * from employee;
+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
| Raghav  | 3000   | Hyderabad      |
| Raghav  | 3000   | Hyderabad      |
| Kalyan  | 4000   | Vishakhapatnam |
| Rukmini | 5000   | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+
9 rows in set (0.00 sec)