JDBC 中的 CallableStatement 是什么?

jdbcjava 8mysqlmysqli

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

创建 CallableStatement

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

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

假设您在数据库中有一个名为 myProcedure 的过程,您可以准备一个可调用语句,如下所示:

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

为输入参数设置值

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

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

注意:除了索引,您还可以以字符串格式传递参数的名称。

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 {
      //Registering the Driver
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());

      //Getting the connection
      String mysqlUrl = "jdbc:mysql://localhost/testdb";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //Preparing a CallableStateement
      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)

相关文章