Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ใช้ PreparedStatement ใน Java กับ MySQL: WHERE condition แบบปลอดภัย

ทำไมต้อง 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 rangeindex เริ่มจาก 1 ไม่ใช่ 0ตรวจสอบลำดับ ?
Data truncationค่ายาวเกินคอลัมน์เพิ่มขนาด VARCHAR หรือ validate input
Communications link failureเชื่อมต่อ DB ไม่ได้ตรวจสอบ host, port, firewall, service