一尘不染

java.util.Date与java.sql.Date

java

java.util.Datevs java.sql.Date:什么时候使用,为什么?


阅读 374

收藏
2020-02-29

共1个答案

一尘不染

恭喜,你已经使用JDBC达到了我最喜欢的功能:Date类处理。

基本上,数据库通常至少支持三种形式的日期时间字段,即日期,时间和时间戳。它们每个在JDBC中都有一个对应的类,并且每个都进行了扩展java.util.Date。这三个中的每个的快速语义如下:

  • java.sql.Date对应于SQL DATE,这表示它存储年,月和日,而时,分,秒和毫秒被忽略。此外,sql.Date它与时区无关。
  • java.sql.Time对应于SQL TIME,并且应该很明显,它仅包含有关小时,分钟,秒和毫秒的信息。
  • java.sql.Timestamp对应于SQL TIMESTAMP,它是具有可自定义精度的精确日期,以纳秒为单位(请注意,util.Date仅支持毫秒!)。
    与这三种类型相关联使用JDBC驱动程序时,最常见的错误之一是这些类型的处理不正确。这意味着sql.Date特定于时区,sql.Time包含当前的年,月和日等。

最后:使用哪个?

确实取决于字段的SQL类型。PreparedStatement有三个值的设置器,#setDate()分别是for sql.Date,#setTime()for sql.Time和#setTimestamp()for sql.Timestamp

请注意,如果你使用的ps.setObject(fieldIndex, utilDateObject);话,实际上可以util.Date为大多数JDBC驱动程序提供一个普通的驱动程序,它会很高兴地吞噬它,就好像它是正确的类型一样,但是当你随后请求数据时,你可能会发现实际上丢失了一些东西。

我真的是说完全不应该使用任何日期。

我的意思是将毫秒/纳秒保存为普通的long,并将其转换为你正在使用的任何对象(强制性的joda-time插件)。一种可行的方法是将日期部分存储为一个长期时间部分,将日期和时间部分存储为另一个,例如现在将是20100221和154536123。这些不可思议的数字可以在SQL查询中使用,并且可以从数据库移植到另一个数据库中,将使你完全避免JDBC / Java Date API:s的这一部分。

2020-02-29