使用 PreparedStatement.setString() 向資料庫 DATE 類型欄位寫入字符串 "2016-9-20" 竟能成功,這背後是 JDBC 驅動程式自動完成了類型轉換。
setString() 時,若目標列為日期/時間類型,會嘗試解析字符串為對應的 SQL DATE/TIMESTAMP。yyyy-MM-dd、yyyy-MM-dd HH:mm:ss 等,具體視驅動實現而定。| 方式 | 優點 | 缺點 |
|---|---|---|
| setString("2016-9-20") | 代碼簡短 | 依賴驅動解析,跨資料庫可移植性差;格式不匹配拋運行時異常 |
| setDate(java.sql.Date) | 類型安全,編譯期檢查,跨資料庫行為一致 | 需額外轉換步驟 |
String dateStr = "2016-09-20"; // 建議補齊月日雙位數
java.sql.Date sqlDate = java.sql.Date.valueOf(dateStr); // 僅支援 yyyy-MM-dd
// 或使用 LocalDate (Java 8+)
LocalDate localDate = LocalDate.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE);
java.sql.Date sqlDate = java.sql.Date.valueOf(localDate);
preparedStatement.setDate(1, sqlDate);
setString 能寫入 Date 列是驅動層的「便利行為」,非標準保證。setDate / setTimestamp 等強類型方法,配合 java.time 包進行解析與轉換。yyyy-MM-dd 格式並編寫單元測試驗證目標資料庫驅動行為。