CallableStatement接口提供的方法来执行该存储过程。由于JDBC API提供了存储过程SQL转义语法,因此您可以以单一标准方式调用所有RDBMS的存储过程。
您可以使用Connection接口的prepareCall()方法创建CallableStatement(接口)的对象。此方法接受表示查询的字符串变量来调用存储过程,并返回CallableStatement对象。
Callable语句可以具有输入参数,输出参数或两者都有。要将输入参数传递给过程调用,您可以使用占位符,并使用CallableStatement接口提供的setter方法(setInt()setString()
,,setFloat()
)为这些参数设置值。
假设您在数据库中有一个过程名称myProcedure,则可以将可调用语句准备为:
//Preparing a CallableStatement CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");
您可以使用setter方法将值设置为过程调用的输入参数。
它们接受两个参数,一个是表示输入参数的放置索引的整数值,另一个是int或String或float等…表示需要作为输入参数传递给过程的值。
注意:除了索引以外,您还可以使用String格式传递参数名称。
cstmt.setString(1, "Raghav"); cstmt.setInt(2, 3000); cstmt.setString(3, "Hyderabad");
创建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 { //注册驱动程序 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //获得连接 String mysqlUrl = "jdbc:mysql://localhost/testdb"; Connection con = DriverManager.getConnection(mysqlUrl, "root", "password"); System.out.println("Connection established......"); //准备一个CallableStatement- 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 ....
如果使用选择查询检索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)