什么是 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 等,表示您需要作为输入参数传递给过程的值。
注意:除了索引之外,您还可以以字符串格式传递参数的名称。
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 示例,它通过使用可调用语句调用上面创建的过程,将新记录插入 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:///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 ....
如果您使用 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 rows in set (0.00 sec)
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP