java通过jdbc操作mysql时,date、time、timestamp需严格对应java.sql.date、java.sql.time、java.sql.timestamp;读取须用getdate、gettime、gettimestamp方法;插入需用setdate、settime、settimestamp或jdbc 4.2+的setobject配合jdbctype;连接url必须配置servertimezone、usetimezone和uselegacydatetimecode以确保时区正确。

Java 通过 JDBC 操作 MySQL 时,Date、Time、Timestamp 类型需对应使用 java.sql 包下的特定类,不能直接用 java.util.Date 或 LocalDate 等现代时间类(除非显式转换)。核心原则是:MySQL 的 DATE → java.sql.Date,TIME → java.sql.Time,TIMESTAMP → java.sql.Timestamp。
读取时按字段类型匹配对应 sql 类
ResultSet 中获取时间字段必须用对应方法,否则可能抛异常或丢失精度:
-
rs.getDate("col_name")用于 MySQLDATE字段,返回java.sql.Date(只含年月日,时分秒为 0) -
rs.getTime("col_name")用于 MySQLTIME字段,返回java.sql.Time(只含时分秒,日期部分为 1970-01-01) -
rs.getTimestamp("col_name")用于 MySQLTIMESTAMP或DATETIME字段,返回java.sql.Timestamp(含完整日期+时间+纳秒)
注意:rs.getObject("col_name") 可能返回 java.time.LocalDateTime(取决于 JDBC 驱动版本和连接参数),但不推荐依赖它,尤其在老项目中容易出兼容问题。
插入/更新时传入正确的 sql 类型对象
PreparedStatement 设置参数时,也必须用对应类型:
- 对
DATE字段:ps.setDate(1, new java.sql.Date(date.getTime()))(可由java.util.Date或LocalDate转换而来) - 对
TIME字段:ps.setTime(1, new java.sql.Time(time.getTime()))(或用LocalTime构造) - 对
TIMESTAMP字段:ps.setTimestamp(1, new java.sql.Timestamp(System.currentTimeMillis())),推荐用Timestamp.valueOf(LocalDateTime.now())
从 Java 8 开始,建议优先使用 LocalDate、LocalTime、LocalDateTime 做业务逻辑处理,再转成对应的 java.sql.Xxx 类型传给 JDBC。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
连接参数影响时间行为(关键!)
MySQL JDBC URL 中必须配置时区相关参数,否则时间可能错乱(尤其跨时区部署):
-
serverTimezone=Asia/Shanghai:显式指定 MySQL 服务器所在时区(必设) -
useTimezone=true:启用时区转换(默认 false,不设会导致时间偏移) -
useLegacyDatetimeCode=false(JDBC 8.0+ 推荐):启用新时间处理逻辑,支持LocalDateTime直接 set/get
示例完整 URL:jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useTimezone=true&useLegacyDatetimeCode=false
现代写法:JDBC 4.2+ 支持直接使用 java.time 类型
如果使用 MySQL Connector/J 8.0+ 和 JDK 8+,PreparedStatement 和 ResultSet 已支持直接操作 LocalDate、LocalTime、LocalDateTime:
ps.setObject(1, LocalDate.now(), JDBCType.DATE)ps.setObject(2, LocalTime.now(), JDBCType.TIME)ps.setObject(3, LocalDateTime.now(), JDBCType.TIMESTAMP)LocalDateTime dt = (LocalDateTime) rs.getObject("created_at")
这种方式更简洁安全,避免了 java.sql 类的构造和时区陷阱,是当前推荐做法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










