如何使用 JDBC 程序调用接受输入参数的存储过程?

jdbcjava 8object oriented programmingprogramming

答:存储过程是子例程,是存储在 SQL 目录中的 SQL 语句片段。所有可以访问关系数据库(Java、Python、PHP 等)的应用程序都可以访问存储过程。

存储过程包含 IN 和 OUT 参数或两者。如果您使用 SELECT 语句,它们可能会返回结果集。存储过程可以返回多个结果集。

您可以使用以下语法调用存储过程:

CALL procedure_name (input_parameter1, input_parameter2, input_parameter3)

JDBC 提供了标准的存储过程 SQL 转义语法,您可以使用该语法在所有 RDBMS 中执行过程

要使用 JDBC 程序调用存储过程,您需要:

  • 使用 DriverManager 类的 registerDriver() 方法注册驱动程序类。将驱动程序类名称作为参数传递给它。

  • 建立连接:使用 DriverManager 类的 getConnection() 方法连接到数据库。将 URL(字符串)、用户名(字符串)、密码(字符串)作为参数传递给它。

  • 创建 Statement:使用 Connection 接口的 prepareCall() 方法创建 CallableStatement 对象。

  • 执行查询:使用 Statement 接口的 execute() 方法执行查询。

示例

假设数据库中有一个名为 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          |
+----+-----------+-----+---------+----------------+

我们在数据库中创建了一个名为insertData的存储过程,如下所示:

mysql> DELIMITER //;
mysql> Create procedure insertData(
          IN c_id INT,
          IN c_name VARCHAR(255),
          IN c_age INT,
          IN c_sal INT,
          IN c_add VARCHAR(255))
       BEGIN
          INSERT INTO CUSTOMERS VALUES (c_id, c_name, c_age, c_sal, c_add);
       END//
mysql> DELIMITER ;
Query OK, 0 rows affected (0.00 sec)

此过程接受 id(整数)、name(字符串)、age(整数)、salary(整数)和 address(字符串)作为 IN 参数,并在 customers 表中插入新记录。

以下 JDBC 程序与 MySQL 数据库建立连接,使用名为 insertData 的过程在 customers 表中插入 6 条记录。

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CallngStoredProcedureExample_IN {
   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 来调用过程
      CallableStatement cstmt = con.prepareCall("{call insertData(?, ?, ?, ?, ?)}");
      //设置过程的 IN 参数的值
      cstmt.setInt(1, 7);
      cstmt.setString(2, "Trupthi");
      cstmt.setInt(3, 33);
      cstmt.setInt(4, 4360);
      cstmt.setString(5, "Ahmedabad");
      cstmt.execute();
      cstmt.setInt(1, 8);
      cstmt.setString(2, "Mithili");
      cstmt.setInt(3, 26);
      cstmt.setInt(4, 4100);
      cstmt.setString(5, "Vijayawada");
      cstmt.execute();
      cstmt.setInt(1, 9);
      cstmt.setString(2, "Maneesh");
      cstmt.setInt(3, 39);
      cstmt.setInt(4, 4000);
      cstmt.setString(5, "Hyderabad");
      cstmt.execute();
      cstmt.setInt(1, 10);
      cstmt.setString(2, "Rajaneesh");
      cstmt.setInt(3, 30);
      cstmt.setInt(4, 6400);
      cstmt.setString(5, "Delhi");
      cstmt.execute();
      cstmt.setInt(1, 11);
      cstmt.setString(2, "Komal");
      cstmt.setInt(3, 29);
      cstmt.setInt(4, 8000);
      cstmt.setString(5, "Ahmedabad");
      cstmt.execute();
      cstmt.setInt(1, 12);
      cstmt.setString(2, "Manyata");
      cstmt.setInt(3,  25);
      cstmt.setInt(4, 5000);
      cstmt.setString(5, "Vijayawada");
      cstmt.execute();
      System.out.println("Procedure called by passing required values......");
   }
}

输出

Connection established......
Procedure called by passing required values......

如果使用 select 命令检索 customers 表的内容,则可以观察到新添加的记录:

mysql> select * from 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 | Ahmedabad      |
| 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     |
+----+-----------+-----+---------+----------------+
12 rows in set (0.00 sec)

相关文章