Cách dùng Statement, PrepareStatement và CallableStatement trong Java

Leave a Comment

JDBC Statement trong java: Statement, PrepareStatement và CallableStatement


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

Nếu bạn chưa biết JDBC là gì tham thảo bài viết này trước nhé!
JDBC Statement trong java dùng để làm gì?
jdbc
Khi một kết nối được thiết lập, chúng ta có thể tương tác với cơ sở dữ liệu. JDBC StatementPreparedStatement và CallableStatement định nghĩa những phương thức và thuộc tính, cho phép chúng ta thực thi câu lệnh SQL và nhận dữ liệu từ cơ sở dữ liệu của bạn, trong đó:


  • Statement  –  Sử dụng để thực hiện các câu truy vấn SQL tĩnh, không có tham số.

  • 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.

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ụng trong 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ụ Statement:


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

Lưu ý:


  • boolean execute (String SQL): Trả về giá trị true nếu thực thi thành công câu lệnh SQL; ngược lại sẽ trả về giá trị false. Sử dụng phương thức này để thực thi các câu lệnh SQL DDL như tạo cơ sở dữ liệu, tạo bảng, …

  • int executeUpdate (String SQL): Trả về số dòng bị tác động khi thực thi các câu lệnh như INSERT, UPDATE hoặc DELETE.

  • ResultSet executeQuery (String SQL): Trả về một đối tượng ResultSet khi bạn thực thi câu lệnh SELECT.

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, "Messi", "Argentina"));
listUser.add(new User(2, "Ronaldo", "Brazil"));
listUser.add(new User(3, "Rooney", "England"));
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));

Xong. Trên đây là Cách dùng Statement, PrepareStatement và CallableStatement trong JDBC Java có ví dụ đơn giản nhất!



Học hành, Lập trình
Java, Lập trình
If You Enjoyed This, Take 5 Seconds To SHARE It

0 comments:

Post a Comment