发布日期:2018-03-26
java.util.Date和java.sql.Date对比+ 查看更多
java.util.Date和java.sql.Date对比
+ 查看更多
发布日期:2018-03-26 10:44
分类:JAVA
浏览次数:134
java.util.Date和java.sql.Date,什么时候该用哪个?为什么?
回答
你讲到了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()设置sql.Date,setTime()设置sql.Time,setTimestamp()设置sql.Timestamp。如果你使用如下代码:
ps.setObject(fieldIndex, utilDateObject);
那么你可以给大多数JDBC驱动程序提供一个util.Date,程序会把它当作正确的类型接受它,但是如果你稍后请求数据的话,你会发现其实你缺少了数据,就是说前面额对象类型并不正确。
我认为所有的Date都不应该被使用
我所说的是把所有的毫秒或者纳秒保存为纯long,然后转换为你所需要的对象。一个黑客方法是把日期组件存储为一个long类型,把时间组件存储为另一个,比如现在是20100221和154536123。这些数字可以使用在数据库SQL查询中,从一个数据库到另一个数据库之间很方便,并且可以让你完全抛开这部分JDBC/java Date API。
附:强制性的Joda-Time插件:
http://www.joda.org/joda-time/