Hướng dẫn Java JDBC, Ví dụ với CallableStatement trong JDBC

Hướng dẫn Java JDBC, Ví dụ với CallableStatement trong JDBC

CallableStatement

  • CallableStatement là một trong ba loại interace thực thi câu lệnh truy vấn SQL trong JDBC API
  • CallableStatement có hiệu năng cao nhất trong 3 loại interface truy vấn SQL của JDBC
  • CallableStatement được thừa kế từ PreparedStatement
  • CallableStatement được sử dụng để thực thi stored procedures.

Ví dụ với CallableStatement trong JDBC.

Tạo cơ sở dữ liệu demo-jdbc như hình dưới:

CREATE SCHEMA `demo-jdbc` ;

(Xem lại: Cài đặt và cấu hình MySQL)

Hướng dẫn Java JDBC, Ví dụ với Statement trong JDBC

Bây giờ mình sẽ viết 1 chương trình Java kết nối tới database demo-jdbc

  • Tạo 1 table ‘user_info’ với 3 column (id, name, address) trong đó id kiểu int là primary key và tự tăng; name và address kiểu varchar
  • Tạo các bản ghi cho table user_info
  • Tạo một stored procedures lấy thông tin bản ghi theo id.
  • Gọi và truyền id vào stored procedures, hiển thị kết quả.

Vì CallableStatement được thừa kế từ PreparedStatement nên các lệnh INSERT, UPDATE, DELETE, SELECT giống hệ với PreparedStatement, mình chủ yếu tập trung vào tạo và gọi stored procedures.

 

Để kết nối với MySQL bằng Java chúng ta cần download jdbc tương ứng cho MySQL

Các bạn có thể download thư viện jdbc cho MySQL tại đây mysql-connector-java-6.0.6.jar

Hoặc sử dụng maven:

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>

Ở đây mình dùng maven (nếu bạn nào chưa biết maven thì nên tìm hiểu luôn vì nó được dùng nhiều và khá quan trọng khi đi làm)

Tạo table user_info

package stackjava.com.demojdbc.callablestatement;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class CreateTable {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc", "root", "admin1234");
    String sql = "CREATE TABLE user_info (" +
        "  id int(11) NOT NULL AUTO_INCREMENT," +
        "  name varchar(45) DEFAULT NULL," +
        "  address varchar(255) DEFAULT NULL," +
        "  PRIMARY KEY (id)" +
        ")";
    CallableStatement cs = con.prepareCall(sql);
    cs.execute();
    con.close();
    System.out.println("Table is Created!");
  }
}

Insert bản ghi vào table user_info

package stackjava.com.demojdbc.callablestatement;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import stackjava.com.demojdbc.entities.User;

public class InsertRow {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc", "root", "admin1234");
    
    String sql = "INSERT INTO user_info (name, address) VALUES (?, ?);";
    List<User> listUser = new ArrayList<User>();
    listUser.add(new User("Harry", "England"));
    listUser.add(new User("Batman", "USA"));

    CallableStatement cs = con.prepareCall(sql);
    for (User user : listUser) {
      cs.setString(1, user.getName());
      cs.setString(2, user.getAddress());
      cs.execute();
    }
    con.close();
    System.out.println("Inserted!");
  }
}

Tạo stored procedures:

package stackjava.com.demojdbc.callablestatement;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class CreateStoredProcedures {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc", "root", "admin1234");
    String sql ="CREATE PROCEDURE getUserById(IN idUser int)" +
          "BEGIN" +
          " SELECT * FROM user_info WHERE id = idUser;" +
          "END";
    CallableStatement cs = con.prepareCall(sql);
    cs.execute();
    con.close();
    System.out.println("Created Stored Procedures!");
  }
}

Kết quả sau khi chạy lần lượt 3 class trên:

Hướng dẫn Java JDBC, Ví dụ với CallableStatement trong JDBC

Thực hiện gọi stored procedures, truyền id = 1 và lấy về kết quả:

package stackjava.com.demojdbc.callablestatement;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CallStoredProcedures {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    System.out.println("Call Stored Procedures: ");
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo-jdbc", "root", "admin1234");
    String sql = "CALL getUserById(?);";
    CallableStatement cs = con.prepareCall(sql);
    cs.setInt(1, 1);
    cs.executeQuery();
    ResultSet rs = cs.getResultSet();
    while (rs.next()) {
      System.out.println(rs.getInt(1) + "  " + rs.getString(2) + "  " + rs.getString(3));
    }
    con.close();
  }
}

Kết quả:

Hướng dẫn Java JDBC, Ví dụ với CallableStatement trong JDBC

Hướng dẫn Java JDBC, Ví dụ với CallableStatement trong JDBC

Okay, Done!

Download code ví dụ trên tại đây

Xem thêm:

Truy vấn database với jdbc – StatementStatement

Truy vấn database với jdbc – PreparedStatement

stackjava.com