在Java中向MySQL数据库存取日期类型的数据时,可能会遇到一些常见问题,以下是一些关键点和解决办法:
一、问题说明
- MySQL支持多种日期时间类型,如
DATE
、TIME
、DATETIME
、TIMESTAMP
和YEAR
。 - Java中处理日期时间主要使用
java.util.Date
,java.sql.Date
,java.sql.Time
,java.sql.Timestamp
, 以及Java 8引入的java.time.LocalDate
,java.time.LocalTime
,java.time.LocalDateTime
等。 -
MySQL中我们常用的类型为
DATETIME
类型,而Java中我们常用的类型为java.util.Date
,这就遇到了转换问题,下面进行问题分析
二、问题分析
- mysql中的日期类
DATE
、TIME
、DATETIME
、TIMESTAMP
分别对应的是Java中sql
包下的Date
、Time
、Timestamp
,那么就问题就变成util
包下与sql
包下之间的类型转换问题了,这就变得简单了。
三、解决办法
1.Java日期向数据存
方法一:
insert into borrowing_tb (userid,bookid,brwtime)
values (2,8,"2024-06-29 19:49:00")
- 通过上面发现我们可以通过字符串日期向数据库插入日期,那么我们就可以通过
SimpleDateFormat
类中的format
方法先将util.Date
类型转为字符串类型
,再存入数据库,如果对SimpleDateFormat
不太了解的同学可以点下面链接看我的之前发的博客哦 - Java日期类Date、SimpleDateFormat 日期格式类、Calendar详细介绍
方法二:
- 通过API我们发现
sql
包下的日期类的构造方法
的参数都是long
类型的,而util
包下包下的日期类都有一个获得long类型的方法
- 那么我们就可以使用
getTime()
方法将util包下的日期作为sql包下构造方法的参数
,这样我们就实现了util和sql日期的转换问题了,这样才创建的日期是一模一样
的。
- 再使用PreparedStatement将sql类型日期存入数据库:
- 使用
PreparedStatement
来防止SQL注入,并正确绑定日期时间值。例如,对于DATETIME
和TIMESTAMP
类型,可以直接使用setTimestamp
方法。 - 方法与对应的类型不匹配,可能会造成下面图片中的情况
- 使用
2.从数据库中取日期
我们发现
sql
包下的都是util.Date的子类
,那么我们就只需向上转型就可以了,不用强转
,直接向util.Datel类型的对象
赋值即可,取值非常方便,只需要注意方法要用用好
-
结果集读取:
- 查询时,从ResultSet中读取日期时间值,使用相应的
getDate
,getTime
, 或getTimestamp
方法。 - 如果使用Java 8日期时间API,可能需要手动转换ResultSet中的
java.sql.*
类型到新的API类型。
- 查询时,从ResultSet中读取日期时间值,使用相应的
-
时间精度丢失:
- 确保MySQL表的日期时间字段精度与Java对象匹配。例如,如果MySQL的
DATETIME
字段精度设为6(微秒),Java端也应处理到微秒级别。
- 确保MySQL表的日期时间字段精度与Java对象匹配。例如,如果MySQL的
最后
如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍