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

ความแตกต่างระหว่าง execute(), executeQuery(), executeUpdate() ใน JDBC

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, DESCResultSetError หากไม่ใช่ Query
executeUpdate()INSERT, UPDATE, DELETE, DDLint (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()