Trong hướng dẫn này, bạn sẽ tìm hiểu cách gọi các thủ tục lưu trữ MySQL từ JDBC bằng đối tượng Callablestatement.
Trước khi bạn bắt đầu
Để trình diễn, chúng tôi sẽ tạo một quy trình được lưu trữ mới có tên get_candidate_skill
chấp nhận
0 là tham số trong và trả về một tập kết quả chứa các kỹ năng của ứng viên.Code language: SQL [Structured Query Language] [sql]
CALL get_candidate_skill[122];
Code language: SQL [Structured Query Language] [sql]
DELIMITER $$ CREATE PROCEDURE get_candidate_skill[IN candidate_id INT] BEGIN SELECT candidates.id, first_name,last_name, skills.name AS skill FROM candidates INNER JOIN candidate_skills ON candidates.id = candidate_skills.candidate_id INNER JOIN skills ON skills.id = candidate_skills.skill_id WHERE candidates.id = candidate_id; END$$ DELIMITER ;
Hãy để Gọi quy trình được lưu trữ này cho ID ứng cử viên có giá trị 122.
Intucing để Callablestatement và lưu trữ thủ tục Cú pháp gọiCode language: SQL [Structured Query Language] [sql]
CALL get_candidate_skill[122];
Introducing to CallableStatement and stored procedure call syntax
Để gọi các quy trình được lưu trữ hoặc các chức năng được lưu trữ trong MySQL từ JDBC, bạn sử dụng đối tượng
1, được kế thừa từ đối tượng PreadStatement. Cú pháp chung của việc gọi một thủ tục được lưu trữ như sau:Code language: SQL [Structured Query Language] [sql]
CALL get_candidate_skill[122];
Code language: SQL [Structured Query Language] [sql]
{?= call procedure_name[param1,param2,...]}
Bạn bọc cuộc gọi thủ tục được lưu trữ trong niềng răng [{}]. Nếu quy trình được lưu trữ trả về một giá trị, bạn cần thêm dấu câu hỏi và bằng [? =] Trước từ khóa
2. Nếu một thủ tục được lưu trữ không trả về bất kỳ giá trị nào, bạn chỉ cần bỏ qua dấu
CALL get_candidate_skill[122];
Code language: SQL [Structured Query Language] [sql]
3. Trong trường hợp quy trình được lưu trữ chấp nhận bất kỳ tham số nào, bạn liệt kê chúng trong dấu ngoặc đơn mở và đóng sau tên thủ tục được lưu trữ.Code language: SQL [Structured Query Language] [sql]
CALL get_candidate_skill[122];
Sau đây là các ví dụ về việc sử dụng cú pháp để gọi các thủ tục được lưu trữ trong các bối cảnh khác nhau:
Cú pháp | Cửa hàng thủ tục |
{& nbsp; Gọi quy trình_name []} | Chấp nhận không có tham số và trả về không có giá trị |
{Gọi thủ tục_name [?,?]} | Chấp nhận hai tham số và trả về không có giá trị |
{? = Gọi thủ tục_name []} | Chấp nhận không có tham số và giá trị trả về |
{? = Gọi thủ tục_name [?]} | Chấp nhận một tham số và giá trị trả về |
Lưu ý rằng câu hỏi đánh dấu trình giữ chỗ [?] Có thể được sử dụng cho cả các tham số trong, ra và inout. Để biết thông tin chi tiết về các loại tham số khác nhau trong các quy trình được lưu trữ, hãy xem hướng dẫn tham số thủ tục lưu trữ MySQL.
Ví dụ về thủ tục lưu trữ JDBC MySQL
Đầu tiên, hãy mở kết nối với máy chủ MySQL bằng cách tạo đối tượng
4 mới.Code language: SQL [Structured Query Language] [sql]
CALL get_candidate_skill[122];
Code language: Java [java]
Connection conn = DriverManager.getConnection[];
Sau đó, chuẩn bị một cuộc gọi thủ tục được lưu trữ và tạo đối tượng
1 bằng cách gọi phương thứcCode language: SQL [Structured Query Language] [sql]
CALL get_candidate_skill[122];
6 của đối tượngCode language: SQL [Structured Query Language] [sql]
CALL get_candidate_skill[122];
4.
CALL get_candidate_skill[122];
Code language: SQL [Structured Query Language] [sql]
Code language: Java [java]
String query = "{CALL get_candidate_skill[?]}"; CallableStatement stmt = conn.prepareCall[query]
Tiếp theo, chuyển tất cả các tham số cho quy trình được lưu trữ. Trong trường hợp này, thủ tục được lưu trữ get_candidate_skill
chỉ chấp nhận một trong tham số.
Code language: Java [java]
stmt.setInt[1, candidateId];
Sau đó, thực hiện quy trình được lưu trữ bằng cách gọi phương thức
9 của đối tượngCode language: SQL [Structured Query Language] [sql]
CALL get_candidate_skill[122];
1. Nó trả về một kết quả được thiết lập trong trường hợp này.Code language: SQL [Structured Query Language] [sql]
CALL get_candidate_skill[122];
Code language: Java [java]
ResultSet rs = stmt.executeQuery[];
Cuối cùng, đi qua
1 để hiển thị kết quả.Code language: SQL [Structured Query Language] [sql]
{?= call procedure_name[param1,param2,...]}
Code language: Java [java]
while [rs.next[]] { System.out.println[String.format["%s - %s", rs.getString["first_name"] + " " + rs.getString["last_name"], rs.getString["skill"]]]; }
Sau đây là ví dụ đầy đủ về việc gọi thủ tục lưu trữ MySQL từ JDBC.
Code language: Java [java]
package org.mysqltutorial; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.CallableStatement; /** * * @author mysqltutorial.org */ public class Main { /** * Get skills by candidate id * * @param candidateId */ public static void getSkills[int candidateId] { // String query = "{ call get_candidate_skill[?] }"; ResultSet rs; try [Connection conn = MySQLJDBCUtil.getConnection[]; CallableStatement stmt = conn.prepareCall[query]] { stmt.setInt[1, candidateId]; rs = stmt.executeQuery[]; while [rs.next[]] { System.out.println[String.format["%s - %s", rs.getString["first_name"] + " " + rs.getString["last_name"], rs.getString["skill"]]]; } } catch [SQLException ex] { System.out.println[ex.getMessage[]]; } } /** * * @param args */ public static void main[String[] args] { getSkills[122]; } }
Hãy để chạy chương trình.
Chương trình hoạt động như mong đợi.
Trong hướng dẫn này, chúng tôi đã chỉ cho bạn cách gọi một quy trình được lưu trữ trong cơ sở dữ liệu MySQL từ chương trình Java bằng đối tượng JDBC CallableStatement.
Hướng dẫn này có hữu ích không?