java.util.Date
vs java.sql.Date
:什么时候使用哪个以及为什么?
恭喜,您已经解决了 JDBC 中我最讨厌的问题:日期类处理。
基本上数据库通常至少支持three日期时间字段的形式,包括日期、时间和时间戳。其中每一个在 JDBC 中都有一个对应的类他们每个人都延伸java.util.Date http://docs.oracle.com/javase/8/docs/api/index.html?java/util/Date.html。这三个的快速语义如下:
-
java.sql.Date http://docs.oracle.com/javase/8/docs/api/index.html?java/sql/Date.html对应于 SQL DATE 这意味着它存储年、月、日 while 小时、分钟、秒和毫秒被忽略。此外
sql.Date
与时区无关。
-
java.sql.Time http://docs.oracle.com/javase/8/docs/api/index.html?java/sql/Time.html对应于 SQL TIME 并且应该是显而易见的,仅包含以下信息小时、分钟、秒和毫秒.
-
java.sql.Timestamp http://docs.oracle.com/javase/8/docs/api/index.html?java/sql/Timestamp.html对应于 SQL TIMESTAMP,它是精确到纳秒的日期(注意
util.Date
只支持毫秒!)具有可定制的精度。
使用与这三种类型相关的 JDBC 驱动程序时最常见的错误之一是类型处理不正确。这意味着sql.Date
是特定于时区的,sql.Time
包含当前的年、月、日等等。
最后:使用哪一个?
实际上取决于字段的 SQL 类型。PreparedStatement
具有所有三个值的设置器,#setDate()
成为一个sql.Date
, #setTime()
for sql.Time
and #setTimestamp()
for sql.Timestamp
.
请注意,如果您使用ps.setObject(fieldIndex, utilDateObject);
你实际上可以给一个正常的util.Date
对于大多数 JDBC 驱动程序来说,它们会很高兴地吞噬它,就好像它是正确的类型一样,但是当您随后请求数据时,您可能会注意到实际上丢失了一些东西。
我真的是说根本不应该使用任何日期。
我的意思是将毫秒/纳秒保存为普通长整型并将它们转换为您正在使用的任何对象(强制性的乔达时间插头 http://www.joda.org/joda-time/)。一种可行的方法是将日期组件存储为一个长组件,将时间组件存储为另一个组件,例如现在是 20100221 和 154536123。这些幻数可以在 SQL 查询中使用,并且可以从数据库移植到另一个数据库,将使您完全避免 JDBC/Java Date API 的这一部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)