MySQL 8+ 推荐用 java.time 类映射日期类型:DATETIME/TIMESTAMP→LocalDateTime,DATE→LocalDate,TIME→LocalTime,需配置 JDBC 参数 serverTimezone 和 useLegacyDatetimeCode=false,MyBatis 3.4+ 和 Hibernate 5.2+ 均原生支持。

MySQL 的日期时间类型在 Java 8+ 中推荐使用 java.time 包下的不可变、线程安全的时间类,而不是过时的 java.util.Date 或 java.sql 下的旧类。关键在于 JDBC 驱动版本、数据库连接参数和 ORM 框架(如 MyBatis、Hibernate)的配置是否支持直接映射。
MySQL 类型与 Java 8 时间类对应关系
常见 MySQL 时间类型应映射为以下 Java 类:
- DATETIME / TIMESTAMP → LocalDateTime(无时区,表示本地日期时间)
- DATE → LocalDate(仅日期)
- TIME → LocalTime(仅时间)
- TIMESTAMP WITH TIME ZONE(MySQL 8.0.19+) → OffsetDateTime 或 ZonedDateTime(需显式配置时区)
JDBC 连接必须启用时区和时序支持
MySQL Connector/J 8.0+ 默认启用 java.time 支持,但需确保连接 URL 包含必要参数,否则可能自动降级为 java.util.Date:
- 指定服务器时区:
&serverTimezone=Asia/Shanghai(避免因系统默认时区导致时间偏移) - 强制使用新时间类:
&useLegacyDatetimeCode=false(必须设为 false) - 示例完整 URL:
jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&useLegacyDatetimeCode=false
MyBatis 中无需额外类型处理器(MyBatis 3.4+)
MyBatis 3.4 起内置支持 java.time 类型,只要 JDBC 配置正确,实体类可直接使用:
立即学习“Java免费学习笔记(深入)”;
public class Order {
private Long id;
private LocalDateTime createTime; // 对应 DATETIME 字段
private LocalDate orderDate; // 对应 DATE 字段
private LocalTime deliveryTime; // 对应 TIME 字段
}
SQL 映射中保持原样写字段名,MyBatis 自动完成转换。若用注解方式(@Select),也无需额外处理。
Hibernate / JPA 需注意方言和属性配置
使用 Hibernate 5.2+ 时,默认已适配 Java 8 时间类型,但仍建议显式指定:
- 确认
hibernate.dialect为org.hibernate.dialect.MySQL8Dialect(MySQL 8 推荐)或MySQLDialect(5.7 及以下) - 实体字段加
@Column即可,无需@Temporal(该注解已废弃) - 如需存储带时区的
TIMESTAMP,字段用OffsetDateTime,并确保数据库列定义为TIMESTAMP+ 显式时区上下文
不复杂但容易忽略:驱动版本低于 8.0、连接参数缺失 useLegacyDatetimeCode=false 或未设 serverTimezone,都会导致映射失败或时间错乱。


















