ภาพรวม
ใช้ PreparedStatement และ java.sql.Date เพื่อ Insert วันที่ลง MySQL อย่างปลอดภัย (ป้องกัน SQL Injection) และถูกต้อง
โครงสร้างตาราง MySQL
CREATE TABLE DemoTable (
PassengerId INT,
PassengerName VARCHAR(40),
ArrivalDate DATE
);
โค้ด Java สมบูรณ์
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class InsertDateFromJava {
public static void main(String[] args) {
Connection con = null;
PreparedStatement ps = null;
try {
// 1. สร้าง java.util.Date (วันเวลาปัจจุบัน)
java.util.Date javaDate = new java.util.Date();
// 2. แปลงเป็น java.sql.Date (เฉพาะ Date ไม่มี Time)
java.sql.Date mySQLDate = new java.sql.Date(javaDate.getTime());
// 3. เชื่อมต่อ Database
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/web?useSSL=false",
"root", "123456"
);
// 4. PreparedStatement พร้อม Placeholder (?)
String query = "INSERT INTO DemoTable (PassengerId, PassengerName, ArrivalDate) VALUES (?, ?, ?)";
ps = con.prepareStatement(query);
// 5. Bind Parameters
ps.setInt(1, 101);
ps.setString(2, "Adam");
ps.setDate(3, mySQLDate); // สำคัญ: ใช้ setDate สำหรับ DATE
// 6. Execute
ps.executeUpdate();
System.out.println("Record is inserted with current Date......");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7. ปิด Resource (สำคัญ!)
try { if (ps != null) ps.close(); } catch (Exception e) {}
try { if (con != null) con.close(); } catch (Exception e) {}
}
}
}
จุดสำคัญ
| ขั้นตอน | คำอธิบาย |
|---|---|
| java.util.Date | Date + Time (Java Standard) |
| java.sql.Date | Date เท่านั้น (extends util.Date) - สำหรับ SQL DATE |
| getTime() | คืนค่า Milliseconds since Epoch (ร่วมกันได้) |
| ps.setDate() | Bind java.sql.Date เข้า Parameter |
| ? | Placeholder ป้องกัน SQL Injection |
ผลลัพธ์ใน MySQL
SELECT * FROM DemoTable;
+-------------+---------------+-------------+
| PassengerId | PassengerName | ArrivalDate |
+-------------+---------------+-------------+
| 101 | Adam | 2019-09-07 |
+-------------+---------------+-------------+
กรณี DateTime / Timestamp
// สำหรับ DATETIME / TIMESTAMP ใช้ java.sql.Timestamp
java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(javaDate.getTime());
ps.setTimestamp(3, sqlTimestamp);
Best Practices
- ใช้
try-with-resources(Java 7+) เพื่อ Auto-close - ใช้ Connection Pool (HikariCP, DBCP) ใน Production
- กำหนด Timezone ให้ตรงกัน:
serverTimezone=UTCใน JDBC URL - Batch Insert:
ps.addBatch()+ps.executeBatch()สำหรับข้อมูลมาก
สรุป
แปลง java.util.Date → java.sql.Date → ps.setDate() เพื่อ Insert DATE ลง MySQL อย่างถูกต้องและปลอดภัย