Computer >> Máy Tính >  >> Lập trình >> MySQL

CallableStatement trong JDBC là gì?

Câu lệnh có thể gọi giao diện cung cấp các phương thức để thực thi các thủ tục được lưu trữ. Vì API JDBC cung cấp cú pháp thoát SQL của thủ tục được lưu trữ, bạn có thể gọi các thủ tục được lưu trữ của tất cả RDBMS theo một cách tiêu chuẩn duy nhất.

Tạo câu lệnh có thể gọi

Bạn có thể tạo một đối tượng của CallableStatement (giao diện) bằng cách sử dụng Chuẩn bị gọi () phương pháp của Kết nối giao diện. Phương thức này chấp nhận một biến chuỗi đại diện cho một truy vấn để gọi thủ tục được lưu trữ và trả về Câu lệnh có thể gọi đối tượng.

Một câu lệnh Callable có thể có tham số đầu vào, tham số đầu ra hoặc cả hai. Để chuyển các tham số đầu vào cho lệnh gọi thủ tục, bạn có thể sử dụng trình giữ chỗ và đặt giá trị cho các tham số này bằng cách sử dụng các phương thức setter (setInt (), setString (), setFloat ()) được cung cấp bởi giao diện CallableStatement.

Giả sử bạn có một tên thủ tục myProcedure trong cơ sở dữ liệu, bạn có thể chuẩn bị một câu lệnh có thể gọi là:

//Preparing a CallableStatement
CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");

Đặt giá trị cho các tham số đầu vào

Bạn có thể đặt giá trị cho các tham số đầu vào của lệnh gọi thủ tục bằng các phương thức setter.

Các tham số này chấp nhận hai đối số, một là giá trị số nguyên đại diện cho chỉ số vị trí của tham số đầu vào và đối số kia là int hoặc, String hoặc, float, v.v. đại diện cho giá trị bạn cần truyền tham số asinput cho thủ tục.

Lưu ý: Thay vì chỉ mục, bạn cũng có thể chuyển tên của tham số ở định dạng Chuỗi.

cstmt.setString(1, "Raghav");
cstmt.setInt(2, 3000);
cstmt.setString(3, "Hyderabad");

Thực thi câu lệnh có thể gọi

Khi bạn đã tạo đối tượng CallableStatement, bạn có thể thực thi nó bằng cách sử dụng một trong các lệnh execute () phương pháp.

cstmt.execute();

Ví dụ

Giả sử chúng ta có một bảng có tên là Nhân viên trong cơ sở dữ liệu MySQL với dữ liệu sau:

+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+

Và chúng tôi đã tạo một thủ tục có tên là myProcedure để chèn các giá trị vào bảng này như hình dưới đây:

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 //

Sau đây là một ví dụ JDBC chèn các bản ghi mới vào bảng Nhân viên bằng cách gọi thủ tục đã tạo ở trên, sử dụng một câu lệnh có thể gọi.

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 ....");
   }
}

Đầu ra

Connection established......
Rows inserted ....

Nếu bạn truy xuất nội dung của bảng Nhân viên bằng truy vấn chọn, bạn có thể quan sát các bản ghi mới được thêm vào như hình dưới đây:

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)