如何使用JDBC API调用数据库中的现有存储过程?
答:存储过程是子例程,是SQL语句的一部分,存储在SQL目录中。所有可以访问关系数据库的应用程序(Java,Python,PHP等)都可以访问存储过程。
存储过程包含IN和OUT参数或两者。如果您使用SELECT语句,它们可能会返回结果集。存储过程可以返回多个结果集。
您可以使用以下语法调用存储过程:
CALL procedure_name ()
JDBC提供了标准的存储过程SQL转义语法,您可以使用该语法在所有RDBMS中进行过程
要使用JDBC程序调用存储过程,您需要:
注册驱动程序:使用DriverManager类的registerDriver()方法注册驱动程序类。将驱动程序类名称作为参数传递给它。
建立连接:使用getConnection()DriverManager类的方法连接数据库。将URL(字符串),用户名(字符串),密码(字符串)作为参数传递给它。
CreateStatement:使用Connection接口的prepareCall()
方法创建CallableStatement对象。
执行查询:使用executeQuery()
Statement接口的方法执行查询。
示例
假设我们在数据库中有一个名为customers的表,其内容如下:
+----+-----------+-----+---------+----------------+ | ID | NAME | AGE | SALARY | ADDRESS | +----+-----------+-----+---------+----------------+ | 1 | Amit | 25 | 3000.00 | Hyderabad | | 2 | Kalyan | 27 | 4000.00 | Vishakhapatnam | | 3 | Renuka | 30 | 5000.00 | Delhi | | 4 | Archana | 24 | 1500.00 | Delhi | | 5 | Koushik | 30 | 9000.00 | Delhi | | 6 | Hardik | 45 | 6400.00 | Delhi | | 7 | Trupthi | 33 | 4360.00 | Delhi | | 8 | Mithili | 26 | 4100.00 | Vijayawada | | 9 | Maneesh | 39 | 4000.00 | Hyderabad | | 10 | Rajaneesh | 30 | 6400.00 | Delhi | | 11 | Komal | 29 | 8000.00 | Ahmedabad | | 12 | Manyata | 25 | 5000.00 | Vijayawada | +----+-----------+-----+---------+----------------+
我们已经在MySQL中创建了一个名为restoreData的存储过程,该存储过程检索此表的内容,如下所示:
mysql> DELIMITER // ; mysql> Create procedure retrieveData()BEGIN Select * from customers; END// mysql> DELIMITER ;
接下来的JDBC程序建立与MySQL数据库的连接,调用名为restoreData的过程,检索过程返回的ResultSet对象,并显示其内容。
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; public class CallngStoredProcedureExample { public static void main(String args[]) throws SQLException { //注册驱动程序 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); //获得连接 String mysqlUrl = "jdbc:mysql://localhost/mydatabase"; Connection con = DriverManager.getConnection(mysqlUrl, "root", "password"); System.out.println("Connection established......"); //准备一个CallableStatement来调用retrieveData过程 CallableStatement cstmt = con.prepareCall("{call retrieveData()}"); //执行CallableStatement- ResultSet rs = cstmt.executeQuery(); //显示结果 while(rs.next()) { System.out.print("ID: "+rs.getInt("ID")+", "); System.out.print("Name: "+rs.getString("Name")+", "); System.out.print("Age: "+rs.getInt("Age")+", "); System.out.print("Salary: "+rs.getInt("Salary")+", "); System.out.print("Address: "+rs.getString("Address")); System.out.println(); } } }
输出结果
Connection established...... ID: 1, Name: Amit, Age: 25, Salary: 3000, Address: Hyderabad ID: 2, Name: Kalyan, Age: 27, Salary: 4000, Address: Vishakhapatnam ID: 3, Name: Renuka, Age: 30, Salary: 5000, Address: Delhi ID: 4, Name: Archana, Age: 24, Salary: 1500, Address: Delhi ID: 5, Name: Koushik, Age: 30, Salary: 9000, Address: Delhi ID: 6, Name: Hardik, Age: 45, Salary: 6400, Address: Delhi ID: 7, Name: Trupthi, Age: 33, Salary: 4360, Address: Delhi ID: 8, Name: Mithili, Age: 26, Salary: 4100, Address: Vijayawada ID: 9, Name: Maneesh, Age: 39, Salary: 4000, Address: Hyderabad ID: 10, Name: Rajaneesh, Age: 30, Salary: 6400, Address: Delhi ID: 11, Name: Komal, Age: 29, Salary: 8000, Address: Ahmedabad ID: 12, Name: Manyata, Age: 25, Salary: 5000, Address: Vijayawada