PreparedStatement là interface kế thừa Statement, đại diện cho câu SQL được biên dịch trước (precompiled), có thể thực thi nhiều lần với tham số khác nhau. Giúp ngăn chặn SQL Injection và tăng hiệu suất.
Tạo PreparedStatement
Dùng Connection.prepareStatement(sql) với placeholder ?:
String query = "INSERT INTO Employee(Name, Salary, Location) VALUES (?, ?, ?)"; PreparedStatement pstmt = con.prepareStatement(query);
Database biên dịch và lưu query plan khi gọi prepareStatement().
Đặt giá trị cho placeholder
Dùng các phương thức setXxx(index, value):
pstmt.setString(1, "Amit"); pstmt.setInt(2, 30000); pstmt.setString(3, "Hyderabad"); // Lặp lại cho các bản ghi khác pstmt.setString(1, "Kalyan"); pstmt.setInt(2, 40000); pstmt.setString(3, "Vishakhapatnam");
Thực thi
execute(): trả về boolean (ít dùng cho PreparedStatement)executeQuery(): trả về ResultSet (cho SELECT)executeUpdate(): trả về int số dòng ảnh hưởng (cho INSERT/UPDATE/DELETE)
Ví dụ hoàn chỉnh (INSERT)
PreparedStatement pstmt = con.prepareStatement("INSERT INTO Employees(Name, Salary, Location) VALUES (?, ?, ?)");
pstmt.setString(1, "Amit"); pstmt.setInt(2, 30000); pstmt.setString(3, "Hyderabad");
pstmt.setString(1, "Kalyan"); pstmt.setInt(2, 40000); pstmt.setString(3, "Vishakhapatnam");
pstmt.setString(1, "Renuka"); pstmt.setInt(2, 50000); pstmt.setString(3, "Delhi");
pstmt.setString(1, "Archana"); pstmt.setInt(2, 15000); pstmt.setString(3, "Mumbai");
int num = pstmt.executeUpdate(); // 4 rows inserted
Kết quả trong database:
+---------+--------+----------------+ | Name | Salary | Location | +---------+--------+----------------+ | Amit | 30000 | Hyderabad | | Kalyan | 40000 | Vishakhapatnam | | Renuka | 50000 | Delhi | | Archana | 15000 | Mumbai | +---------+--------+----------------+
Lợi ích: Biên dịch 1 lần, chạy nhiều lần; ngăn SQL Injection; tự động escape giá trị; hỗ trợ batch update (addBatch(), executeBatch()).