JDBC 中 CallableStatement 是什么?

JDBC 中 CallableStatement 是什么?

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

阅读更多:MySQL 教程

创建 CallableStatement

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

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

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

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

为输入参数设置值

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

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

注意: 您可以传递参数的名称作为字符串格式,而不是索引。

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

执行 Callable 语句

创建 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 示例,通过使用 Callable 语句调用上述创建的过程,将新记录插入 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("连接已建立......");

      //准备调用语句
      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("行已插入 ...."); 
   } 
}

输出

连接已建立......
行已插入 ....

如果使用select查询检索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行结果(0.00秒)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程