http://vietjack.com/java_jdbc/index.jsp Copyright © vietjack.com CallableStatement Interface JDBC CallableStatement Interface sử dụng để thực thi Stored Procedure Một đối tượng CallableStatement trả nhiều đối tượng ResultSet Như bạn biết, việc sử dụng Stored Procedure giúp nâng cao hiệu suất chúng biên dịch trước Nếu bạn chưa tìm hiểu Stored Procedure, liệt kê số điểm khác Stored Procedure hàm để bạn dễ theo dõi: Stored Procedure Hàm Được sử dụng để thực trình logic Được sử dụng để thực phép tính tốn Khơng bắt buộc phải có kiểu trả Phải có kiểu trả Có thể trả nhiều giá trị Có thể trả giá trị Chúng ta gọi hàm từ procedure Procedure gọi từ hàm Procedure hỗ trợ tham số input output Hàm hỗ trợ tham số input Xử lý ngoại lệ với khối try/catch sử dụng procedure Xử lý ngoại lệ với try/catch sử dụng hàm người dùng tự định nghĩa Tạo đối tượng CallableStatement JDBC Đầu tiên, bạn tạo stored procedure đơn giản MySQL để lấy tên sinh viên sau: DELIMITER $$ DROP PROCEDURE IF EXISTS `sinhvien`.`getTenSV` $$ CREATE PROCEDURE `sinhvien`.`getTenSV` (IN MS_SINHVIEN INT, OUT TEN_SINHVIEN VARCHAR(255)) BEGIN SELECT ten INTO TEN_SINHVIEN FROM sinhvienk60 WHERE MSSV = MS_SINHVIEN; END $$ DELIMITER ; Chạy đoạn code MySQL bạn tạo Stored Procedure Trong đó: http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/java_jdbc/index.jsp Copyright â vietjack.com sinhvien l tờn sở liệu • getTenSV tên stored procedure • sinhvienk60 tên bảng • Bạn phải ý DELIMITER $$ DELIMITER ;, hai khơng thể thiếu Có ba kiểu tham số IN, OUT INOUT Đối tượng PreparedStatement sử dụng tham số IN, đối tượng CallableStatement sử dụng ba tham số • Tham số IN: Là tham số mà giá trị chưa biết lệnh SQL tạo Bạn gắn kết giá trị tới tham số IN phương thức setXXX() • Tham số OUT: Là tham số mà giá trị cung cấp lệnh SQL trả Giá trị chúng thu nhận thông qua phương thức getXXX() Trong đó, kiểu tất tham số OUT phải đăng ký trước thực thi stored procedure • Tham số INOUT: Là tham số mà cung cấp giá trị input output Bạn gắn kết biến với phương thức setXXX() thu nhận giá trị với phương thức getXXX() Để lấy instance đối tượng CallableStatement, bạn sử dụng phương thức prepareCall()của Connection Interface Dưới cú pháp phương thức này: public CallableStatement prepareCall("{ call ten_procedure(?,? ?)}"); Trong đó, dấu ? đại diện cho tham số Tiếp theo, bạn theo dõi mẫu code để gọi stored procedure Bạn để ý getEmp nhận hai tham số: CallableStatement cstmt = null; try { String SQL = "{call getTenSV (?, ?)}"; cstmt = conn.prepareCall (SQL); } catch (SQLException e) { } finally { } Đóng đối tượng CallableStatement JDBC Để đóng đối tượng CallableStatement, bạn sử dụng phương thức close() theo mẫu sau: http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/java_jdbc/index.jsp Copyright © vietjack.com CallableStatement cstmt = null; try { String SQL = "{call getTenSV (?, ?)}"; cstmt = conn.prepareCall (SQL); } catch (SQLException e) { } finally { cstmt.close(); } Ví dụ đối tượng CallableStatement JDBC package com.vietjack.jdbc; //Buoc 1: Ban can inport cac package can thiet import java.sql.*; public class ViDuJDBC { // Ten cua driver va dia chi URL cua co so du lieu static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/sinhvien"; // Ten nguoi dung va mat khau cua co so du lieu static final String USER = "root"; static final String PASS = "123456"; public static void main(String[] args) { Connection conn = null; CallableStatement stmt = null; try{ // Buoc 2: Dang ky Driver Class.forName("com.mysql.jdbc.Driver"); // Buoc 3: Mo mot ket noi System.out.println("Dang ket noi toi co so du lieu "); conn = DriverManager.getConnection(DB_URL,USER,PASS); // Buoc 4: Thuc thi truy van System.out.println("Tao cac lenh truy van SQL "); String sql = "{call getTenSV (?, ?)}"; stmt = conn.prepareCall(sql); // Dau tien gan ket tham so IN, sau la tham so OUT int MS_SINHVIEN = 2; stmt.setInt(1, MS_SINHVIEN); // Lenh thiet lap mssv la // Dang ky tham so thu hai stmt.registerOutParameter(2, java.sql.Types.VARCHAR); // Su dung phuong thuc execute de chay stored procedure System.out.println("Thuc thi stored procedure " ); stmt.execute(); // Lay ten sinh vien voi phuong thuc getXXX String TEN_SINHVIEN = stmt.getString(2); System.out.println("Ten sinh vien co MSSV: " + MS_SINHVIEN + " la " + TEN_SINHVIEN); stmt.close(); conn.close(); }catch(SQLException se){ // Xu ly cac loi cho JDBC se.printStackTrace(); }catch(Exception e){ // Xu ly cac loi cho Class.forName e.printStackTrace(); }finally{ // Khoi finally duoc su dung de dong cac resource try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ } try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); }// Ket thuc khoi finally }// Ket thuc khoi try System.out.println("\nVietJack chuc cac ban hoc tot!"); }// Ket thuc main }// Ket thuc ViDuJDBC Sao chép dán ví dụ ViDuJDBC.java, sau biên dịch chạy chương trình Java cho kết sau: http://vietjack.com/ Trang chia sẻ các bài học online miễn phí ... tượng CallableStatement, bạn sử dụng phương thức prepareCall()của Connection Interface Dưới cú pháp phương thức này: public CallableStatement prepareCall("{ call ten_procedure(?,? ?)}"); Trong. .. cstmt.close(); } Ví dụ đối tượng CallableStatement JDBC package com.vietjack .jdbc; //Buoc 1: Ban can inport cac package can thiet import java.sql.*; public class ViDuJDBC { // Ten cua driver va dia... cua driver va dia chi URL cua co so du lieu static final String JDBC_ DRIVER = "com.mysql .jdbc. Driver"; static final String DB_URL = "jdbc: mysql://localhost/sinhvien"; // Ten nguoi dung va mat khau