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秒)
极客教程