在 java 中使用 preparedstatement 设置日期参数时,应优先调用 setobject() 方法并传入 java.time.localdate 或 java.time.localdatetime 对象,这是 jdbc 4.2+ 标准中最简洁且类型安全的做法。若需处理包含时间的日期,使用 localdatetime;若仅涉及年月日,使用 localdate。对于旧版驱动或特定场景,也可使用 setdate() 配合 java.sql.date,但需注意其会自动截断时间部分。

如何区分 LocalDate 与 LocalDateTime 的适用场景
选择 LocalDate 还是 LocalDateTime 取决于数据库列的类型及业务需求。如果数据库字段是 DATE 类型(仅存储日期),使用 LocalDate 最为合适,驱动程序会自动将其映射为 SQL DATE。如果数据库字段是 TIMESTAMP 或 DATETIME 类型(存储日期和时间),则必须使用 LocalDateTime 以保留完整的时间信息。使用错误的类型可能导致数据精度丢失或类型不匹配异常。

import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class DateExample {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "password";
// 模拟插入操作
String sqlDate = "INSERT INTO events (event_date) VALUES (?)";
String sqlTimestamp = "INSERT INTO logs (created_at) VALUES (?)";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmtDate = conn.prepareStatement(sqlDate);
PreparedStatement pstmtTime = conn.prepareStatement(sqlTimestamp)) {
// 设置 LocalDate 用于 DATE 类型字段
LocalDate localDate = LocalDate.of(2023, 10, 5);
pstmtDate.setObject(1, localDate);
pstmtDate.executeUpdate();
// 设置 LocalDateTime 用于 TIMESTAMP 类型字段
LocalDateTime localDateTime = LocalDateTime.of(2023, 10, 5, 14, 30, 0);
pstmtTime.setObject(1, localDateTime);
pstmtTime.executeUpdate();
}
}
}
如何处理需要兼容旧版 JDBC 驱动的日期设置
当运行环境低于 Java 8 或使用不支持 java.time API 的老旧 JDBC 驱动时,可以使用传统的 java.sql.Date 和 java.sql.Timestamp。需要注意的是,java.sql.Date 继承自 java.util.Date,但在构造时会强制将时分秒设为零,因此它只适用于纯日期场景。对于包含时间的场景,应使用 java.sql.Timestamp。通过 valueOf() 方法可以从字符串或 java.time 对象转换而来,确保类型正确。

import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class LegacyDateExample {
public static void main(String[] args) throws SQLException {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "password";
String sqlLegacy = "INSERT INTO legacy_table (legacy_date, legacy_time) VALUES (?, ?)";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sqlLegacy)) {
// 从 LocalDate 转换为 java.sql.Date
LocalDate localDate = LocalDate.of(2023, 10, 5);
java.sql.Date sqlDate = java.sql.Date.valueOf(localDate);
pstmt.setDate(1, sqlDate);
// 从 LocalDateTime 转换为 java.sql.Timestamp
LocalDateTime localDateTime = LocalDateTime.of(2023, 10, 5, 14, 30, 0);
java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(localDateTime);
pstmt.setTimestamp(2, sqlTimestamp);
pstmt.executeUpdate();
}
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











