So sánh Statement với PreparedStatement, CallableStatement trong JDBC – Java

So sánh Statement với PreparedStatement, CallableStatement trong JDBC – Java

Statement, PreparedStatement và CallableStatement là 3 loại interace thực thi câu lệnh truy vấn SQL trong JDBC API, trong đó:

  • Statement  –  Sử dụng để thực hiện các câu truy vấn SQL tĩnh
  • PreparedStatement – Sử dụng để thực hiện các  câu truy vấn SQL động hoặc có tham số
  • CallableStatement – Sử dụng để thực thi các stored procedures (Hiểu nôm na là các lệnh định nghĩa sẵn trên database)

Cả 3 interface trên cùng thực hiện công việc khá giống nhau tuy nhiên mỗi loại nên được sử dụng trong từng trường hợp để nâng cao hiệu năng.

So sánh Statement với PreparedStatement, CallableStatement trong JDBC – Java

Statement

Statement được sử dụng để thực thi các câu lệnh SQL tĩnh, chúng ta không thể truyền tham số vào câu SQL trong thời gian runtime.

Statement có hiệu năng (performance) kém hơn  PrepareStatement và CallableStatement .

Statement thường được sử dụngtrong trường hợp câu lệnh SQL chỉ chạy 1 lần, ví dụ sử dụng để thực thi các câu SQL định nghĩa cơ sở dữ liệu – DDL (Data Denifition Language) như CREATE, ALTER, DROP…

Ví dụ:

String sql = "CREATE TABLE user_info (" +
    "  id int(11) NOT NULL AUTO_INCREMENT," +
    "  name varchar(45) DEFAULT NULL," +
    "  email varchar(100) DEFAULT NULL," +
    "  address varchar(255) DEFAULT NULL," +
    "  date_of_birth datetime DEFAULT NULL," +
    "  PRIMARY KEY (id)" +
    ")";
Connection con = connectionUtils.getConnection();
Statement stmt = con.createStatement();
stmt.execute(sql);

PreparedStatement

PreparedStatement được sử dụng để thực thi các câu truy vấn SQL động hoặc có tham số.

PreparedStatement thừa kế từ Statement nhưng nó cho phép truyền các tham số vào câu SQL trong thời gian run time.

PreparedStatement được khuyên sử dụng trong trường hợp câu SQL được sử dụng nhiều lần.

Ví dụ câu lệnh INSERT được dùng lại nhiều lần để insert 1 danh sách user vào database.

List<User> listUser = new ArrayList<User>();
listUser.add(new User(1, "Rooney", "England"));
listUser.add(new User(2, "Ronaldo", "Brazil"));
listUser.add(new User(3, "Torres", "Spain"));

String sql = "INSERT INTO user_info (id, name, address) VALUES (?, ?, ?);";
PreparedStatement pstmt = con.prepareStatement(sql);

for (User user : listUser) {
  pstmt.setInt(1, user.getId());
  pstmt.setString(2, user.getName());
  pstmt.setString(3, user.getAddress());
  pstmt.execute();
}

CallableStatement

CallableStatement được sử dụng để thực thi stored procedures.

CallableStatement được thừa kế từ PreparedStatement và có hiệu năng cao hơn PreparedStatement.

Với CallableStatement, chúng ta có thể truyền 3 loại tham số vào stored procedures là IN (truyền giá trị vào stored procedures), OUT (lấy kết quả trả về từ stored procedures), IN OUT (thực thi cả IN và OUT).

Ví dụ mình tạo một stored procedures thực hiện lấy user theo id:

CREATE PROCEDURE getUserById(IN idUser int)
BEGIN
 SELECT * FROM user_info WHERE id = idUser;
END

Bây giờ mình sẽ sử dụng CallableStatement để gọi câu stored procedures bên trên:

Truyền id = 1 vào stored procedures getUserById và trả kết quả về ResultSet

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

 

Okay, Done!

Thanks các bạn đã theo dõi bài viết!

References:

http://javaconceptoftheday.com/statement-vs-preparedstatement-vs-callablestatement-in-java/

stackjava.com