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

2022-09-03 05:16:48

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

谢谢!

编辑

所以,我看到了这篇文章。是的,那篇帖子中唯一能回答我问题的部分是

...对于大多数JDBC驱动程序,它们会很乐意吞噬它,就好像它是正确的类型一样,但是当您之后请求数据时,您可能会注意到您实际上缺少一些东西。

但是,这并不能真正回答原因


答案 1

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

设置:

从我所看到的,有三层

JDBC wrapper calls (e.g. Spring's SimpleJdbcTemplate)
|
|
Raw JDBC calls (e.g. PreparedStatement)
|
|
JDBC driver (e.g. Oracle)

第一个原因

许多JDBC类包装器,例如Spring的著名包装器,允许您在执行SQL语句时将其作为参数映射。这非常简单,因为它在后台使用原始JDBC时,会将所有从对象转换为正确类型的转换。第一个问题在这里:如果您有以下情况,会发生什么情况:SimpleJdbcTemplateMap<String, Object>java.sql.*

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

春天把它转换成什么?一个?一个?一个?或者它甚至把它扔到一个?正如@BalusC在回答另一个问题这里的另一个人所解释的那样,这三种类型之间存在很大差异。因此,这是不使用的第一个原因:您不能依靠框架的内部约定来为您处理转换。java.sql.Datejava.sql.Timestampjava.sql.Timejava.lang.Objectjava.sqljava.util.Date

第二个原因

现在,谈到原始的JDBC调用,@The Nail解释说你需要这些类型来进行JDBC调用,他是绝对正确的,这对我来说是新闻。但是,仍然有可怕的电话。通过阅读该调用的JavaDoc,对于如果给出.因此,不使用它的第二个原因是因为那里的模糊性。java.sqlsetObjectjava.util.Date

第三个原因

最后,谈谈司机的水平。我可以用个人经验证明,有时Spring与Oracle驱动程序结合使用确实可以与java.util.Date一起使用。有时。有时它不会。因此,由于我不知道任何特定驱动程序的任何特定版本将如何处理,因此最好是显式的。这是第三个原因java.util.Date

结论

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


答案 2

java.sql.Timestamp

围绕 java.util.Date 的精简包装器,允许 JDBC API 将其标识为 SQL TIMESTAMP 值。它增加了保持 SQL TIMESTAMP 小数秒值的能力,允许将小数秒的规格精确到纳秒。时间戳还提供格式化和解析操作,以支持时间戳值的 JDBC 转义语法。

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

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