CallableStatement 接口提供執(zhí)行存儲(chǔ)過程的方法。由于 JDBC API 提供了存儲(chǔ)過程 SQL 轉(zhuǎn)義語法,因此您可以以單一標(biāo)準(zhǔn)方式調(diào)用所有 RDBMS 的存儲(chǔ)過程。
創(chuàng)建 CallableStatement
您可以創(chuàng)建 Connection接口的prepareCall()方法來調(diào)用strong>CallableStatement(接口)。此方法接受一個(gè)表示調(diào)用存儲(chǔ)過程的查詢的字符串變量,并返回一個(gè) CallableStatement 對(duì)象。
Callable 語句可以具有輸入?yún)?shù)、輸出參數(shù)或兩者都有。要將輸入?yún)?shù)傳遞給過程調(diào)用,您可以使用占位符并使用 CallableStatement 接口提供的 setter 方法(setInt()、setString()、setFloat())為這些參數(shù)設(shè)置值。
假設(shè)您數(shù)據(jù)庫中有一個(gè)名為 myProcedure 的過程,您可以準(zhǔn)備一個(gè)可調(diào)用語句,如下所示:
//Preparing a CallableStatement CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");
登錄后復(fù)制
為輸入?yún)?shù)設(shè)置值
您可以使用 setter 方法為過程調(diào)用的輸入?yún)?shù)設(shè)置值。
它們接受兩個(gè)參數(shù),其中一個(gè)是整數(shù)值表示輸入?yún)?shù)的放置索引,另一個(gè)是 int 或、String 或、float 等…表示您需要傳遞的值
向過程輸入?yún)?shù)。
注意:除了索引之外,您還可以以字符串格式傳遞參數(shù)名稱。
cstmt.setString(1, "Raghav"); cstmt.setInt(2, 3000); cstmt.setString(3, "Hyderabad");
登錄后復(fù)制
執(zhí)行 Callable 語句
創(chuàng)建 CallableStatement 對(duì)象后,您可以使用 execute() 方法之一來執(zhí)行它。
cstmt.execute();
登錄后復(fù)制
示例
假設(shè) MySQL 數(shù)據(jù)庫中有一個(gè)名為 Employee 的表,其中包含以下數(shù)據(jù):
+---------+--------+----------------+ | Name | Salary | Location | +---------+--------+----------------+ | Amit | 30000 | Hyderabad | | Kalyan | 40000 | Vishakhapatnam | | Renuka | 50000 | Delhi | | Archana | 15000 | Mumbai | +---------+--------+----------------+
登錄后復(fù)制
我們創(chuàng)建了一個(gè)名為 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 //
登錄后復(fù)制
下面是一個(gè) JDBC 示例,它使用可調(diào)用語句調(diào)用上面創(chuàng)建的過程,將新記錄插入到 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 ...."); } }
登錄后復(fù)制
輸出
Connection established...... Rows inserted ....
登錄后復(fù)制
如果使用 select 查詢檢索 Employee 表的內(nèi)容,您可以觀察到新添加的記錄,如下所示:
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)
登錄后復(fù)制
以上就是JDBC 中的 CallableStatement 是什么?的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注www.92cms.cn其它相關(guān)文章!