为什么不在Jdbc中使用java.util.Date?

dav*_*lab 15 java date jdbc

这是一个简单的问题:我知道并且几乎每个人都听说java.util.Date在Jdbc调用中使用任何东西都是个坏主意.你应该使用java.sql.Date或者java.sql.Timejava.sql.Timestamp.但是,有什么理由不去?我找不到一篇好的博客文章或SO帖子解释它,除了有时人们看到"奇怪的行为".

谢谢!

编辑:

所以,我看过这篇文章.是的,那篇文章的唯一部分是我的问题的答案

...对于大多数JDBC驱动程序来说,它们会愉快地吞噬它,就像它的类型正确一样,但是当你事后请求数据时,你可能会注意到你实际上缺少了东西.

但是,这并没有真正回答原因.

dav*_*lab 16

好的,所以阅读了答案中的所有信息,以及评论中指出的其他帖子等等,我决定总结一下我学到的东西:

设置:

从我所看到的,有三层

JDBC wrapper calls (e.g. Spring's SimpleJdbcTemplate)
|
|
Raw JDBC calls (e.g. PreparedStatement)
|
|
JDBC driver (e.g. Oracle)
Run Code Online (Sandbox Code Playgroud)

第一个原因

许多JDBC类包装器(例如Spring的着名包装器)SimpleJdbcTemplate允许您Map<String, Object>在执行SQL语句时将其作为参数映射.这非常简单,因为java.sql.*当它在引擎盖下使用原始JDBC时,它将对象的所有转换都交给了正确的类型.第一个问题在于:如果您有以下内容会发生什么:

Map<String, Object> paramMap = new HashMap<String,Object>();
paramMap.put("p_some_data", new java.util.Date());
Run Code Online (Sandbox Code Playgroud)

Spring将它转换为什么?一个java.sql.Date?一个java.sql.Timestamp?一个java.sql.Time?或者它甚至把它投到了java.lang.Object?作为深受@BalusC在解释这个回答不同的问题另一老乡 在这里,有这三个之间的巨大差异java.sql的类型.所以,这是不使用的第一个原因java.util.Date:您不能依赖框架的内部约定来为您处理转换.

第二个原因

现在,谈论原始的JDBC调用,@ The Nail 解释说你需要这些java.sql类型来进行JDBC调用,而且他是绝对正确的,这对我来说是新闻.但是,仍有可怕的setObject电话.通过阅读该调用的JavaDoc,如果给出一个,它似乎有点模棱两可java.util.Date.因此,不使用它的第二个原因是因为那里含糊不清.

第三个原因

最后,谈谈司机的水平.我可以证明个人经验,有时Spring与Oracle驱动程序一起工作java.util.Date.有时.然后有时它没有.所以,因为我不知道任何特定驱动程序的任何特定版本将如何处理a java.util.Date,所以最好是明确的.这是第三个原因.

结论

一般来说,看起来原因是:"JDBC不应该与之一起使用java.util.Date.如果你这样做,你就不能确定会发生什么." 这对我来说是个足够好的理由:)


Bhe*_*ung 8

java.sql.Timestamp

java.util.Date的瘦包装器,允许JDBC API将其标识为SQL TIMESTAMP值.它增加了保持SQL TIMESTAMP小数秒值的功能,允许将小数秒的指定精度设置为纳秒.Timestamp还提供格式化和解析操作,以支持时间戳值的JDBC转义语法.

它是时间戳的精确度(由DB提供),它可以保持与java.util.Date.

假设,如果我们使用一个java.util.Date对象来表示DB中的时间戳值,那么该对象表示的值将不会表示相同的值(如在DB中),因为它不能保持"小数秒到精度为纳秒".