ทำไมต้อง PreparedStatement?
- ป้องกัน SQL Injection — ค่าพารามิเตอร์ถูกจัดการแยกจากคำสั่ง SQL
- ประสิทธิภาพดีกว่า — คอมไพล์คำสั่งครั้งเดียว ใช้ซ้ำได้
- จัดการชนิดข้อมูลอัตโนมัติ — ไม่ต้องกังวล quote string หรือ format date
ไวยากรณ์ Java
String query = "SELECT column FROM table WHERE name = ?";
PreparedStatement ps = connection.prepareStatement(query);
ps.setString(1, "John"); // index เริ่มจาก 1
ResultSet rs = ps.executeQuery();
ตัวอย่างเต็ม: เชื่อมต่อ MySQL และ Query
import java.sql.*;
public class PreparedStatementDemo {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/sampledatabase";
String user = "root";
String password = "123456";
String query = "SELECT name FROM demo37 WHERE name = ?";
try (Connection con = DriverManager.getConnection(url, user, password);
PreparedStatement ps = con.prepareStatement(query)) {
ps.setString(1, "John");
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("name"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ตาราง demo37 และข้อมูล
CREATE TABLE demo37 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(200)
);
INSERT INTO demo37 (name) VALUES
('John'), ('Bob'), ('John'), ('Chris'), ('David'), ('John'), ('Mike');
ผลลัพธ์ Output
John
John
John
เมธอด setXxx() ที่ใช้บ่อย
| เมธอด | ชนิดข้อมูล SQL |
| setString() | VARCHAR, CHAR, TEXT |
| setInt() | INT, SMALLINT |
| setLong() | BIGINT |
| setDouble() | DOUBLE, FLOAT |
| setDate() | DATE (java.sql.Date) |
| setTimestamp() | TIMESTAMP, DATETIME |
| setNull() | NULL สำหรับทุกชนิด |
หลักการสำคัญ
- ใช้
? เป็น placeholder ทุกครั้งที่รับค่าจากภายนอก
- อย่าใช้ String concatenation สร้าง SQL:
"WHERE name = '" + name + "'" ❌
- ปิด Resource ด้วย try-with-resources (Java 7+) เพื่อป้องกัน leak
- Driver class:
com.mysql.cj.jdbc.Driver (MySQL 8.0+)
ข้อผิดพลาดที่พบบ่อย
| ข้อผิดพลาด | สาเหตุ | แก้ไข |
| Parameter index out of range | index เริ่มจาก 1 ไม่ใช่ 0 | ตรวจสอบลำดับ ? |
| Data truncation | ค่ายาวเกินคอลัมน์ | เพิ่มขนาด VARCHAR หรือ validate input |
| Communications link failure | เชื่อมต่อ DB ไม่ได้ | ตรวจสอบ host, port, firewall, service |