Interface Statement มี 3 เมธอดหลักสำหรับรัน SQL แต่ละตัวมีวัตถุประสงค์และค่าคืนต่างกัน
1. execute() - สำหรับ DDL และ SQL ทั่วไป
- ใช้กับ: CREATE, ALTER, DROP, หรือ SQL ที่ไม่แน่ใจว่าเป็น SELECT หรือ DML
- คืนค่า:
boolean-trueหากมี ResultSet (SELECT),falseหากเป็น Update Count (INSERT/UPDATE/DELETE/DDL) - ดึงผลลัพธ์:
getResultSet()หรือgetUpdateCount()
// ตัวอย่าง: CREATE TABLE Statement stmt = con.createStatement(); String createTable = "CREATE TABLE Employee(Name VARCHAR(255), Salary INT, Location VARCHAR(255))"; boolean hasResultSet = stmt.execute(createTable); System.out.println(hasResultSet); // false
2. executeQuery() - สำหรับ SELECT (คืน ResultSet)
- ใช้กับ: SELECT, SHOW, DESCRIBE, EXPLAIN
- คืนค่า:
ResultSet(ไม่มีคืนค่า null) - Expception: โยน SQLException หาก SQL ไม่ใช่ Query
// ตัวอย่าง: SELECT
ResultSet rs = stmt.executeQuery("SELECT * FROM Employee");
while (rs.next()) {
System.out.println("Name: " + rs.getString("Name") +
", Salary: " + rs.getInt("Salary") +
", City: " + rs.getString("Location"));
}
3. executeUpdate() - สำหรับ DML (INSERT, UPDATE, DELETE) และ DDL
- ใช้กับ: INSERT, UPDATE, DELETE, CREATE, ALTER, DROP
- คืนค่า:
int- จำนวนแถวที่ได้รับผลกระทบ (Row Count) - DDL: คืนค่า 0
// ตัวอย่าง: INSERT
String insertData = "INSERT INTO Employee(Name, Salary, Location) VALUES ('Amit', 30000, 'Hyderabad')";
int rowsAffected = stmt.executeUpdate(insertData);
System.out.println("Rows inserted: " + rowsAffected); // 1
ตารางเปรียบเทียบ
| เมธอด | SQL ที่เหมาะสม | ค่าคืน | ข้อยกเว้น |
|---|---|---|---|
execute() | ทุกประเภท (DDL, DML, Query) | boolean | ต้องเช็ค getResultSet()/getUpdateCount() |
executeQuery() | SELECT, SHOW, DESC | ResultSet | Error หากไม่ใช่ Query |
executeUpdate() | INSERT, UPDATE, DELETE, DDL | int (row count) | DDL คืน 0 |
แนวทางปฏิบัติที่ดี (Best Practice)
- ใช้
PreparedStatementแทนStatementเพื่อป้องกัน SQL Injection - ใช้
executeQuery()สำหรับ SELECT เสมอ - ใช้
executeUpdate()สำหรับ INSERT/UPDATE/DELETE - ใช้
execute()เฉพาะกรณี Dynamic SQL หรือ DDL - ปิด
ResultSet,Statement,Connectionใน finally block หรือ try-with-resources
PreparedStatement มีเมธอดเดียวกันทั้ง 3
pstmt.execute()pstmt.executeQuery()pstmt.executeUpdate()