什麼是 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