java - 将 java.sql.Date 类型的对象分配给 java.util.Date 变量是否安全?

标签 java sql datetime java-7

在我们的数据库访问层中,我们使用数据类型java.sql.Date 来表示DATE 列,而在我们的bean 中,我们使用 java.util.Date(这是一个遗留应用程序)。

由于 java.sql.Date 扩展 java.util.Date,仅设置 java.sql.Date 对象是否安全我们像这样从 bean 中的 DB 层获取?

java.sql.Date sqlDate;
// bean.setValidFrom(java.util.Date validFrom)
bean.setValidFrom(sqlDate);

代码编译得很好。

最佳答案

不安全。即使 java.sql.Date extends java.util.Date,它也不是合适的子类型,因为它不是行为子类型。下面是一个示例,显示了这两种类型的行为方式有何不同:

// not really a date, but a Date
Date date1 = new Date(0L);                                   
// really a date, but not a Date
java.sql.Date sqlDate = java.sql.Date.valueOf("1970-01-01"); 
// really a date, but a Date?
Date date2 = sqlDate;                                        
// a Date with time
date1.getHours();                                            
// a Date without time. <-- throws an IllegalArgumentException. 
// Wait, exactly *which* argument is illegal?
date2.getHours();                                            

您应该创建一个 java.util.Date 类型的新对象,像这样复制值:

java.sql.Date dateFromDb;
bean.setValidFrom(new java.util.Date(dateFromDb.getTime()));

幸运的是,使用 Java 8 后情况好多了。

关于java - 将 java.sql.Date 类型的对象分配给 java.util.Date 变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34908425/

相关文章:

java - 循环验证直到用户选择正确的选项,如果没有选择正确的选项则继续循环

java - spring boot mvc如何支持多个viewresoler(例如jsp和freemarker)

mysql - SQL Join表获取平均值

mysql - 如何编写一个 SQL 补丁,从表 A 中获取值并将其作为行插入到表 B 中?

datetime - Flutter 如何在共享首选项中保存我的日期

C++ Boost 将 UNIX 时间戳转换为 MySQL 兼容的 DATETIME 字符串

android - 如何从 "Date"对象中获取本地化的 TIME 作为字符串?

java - 混合应用程序不显示滚动条

sql - 如何将两个 PostgreSQL 列聚合到一个用方括号分隔的数组

Java Libgdx - Box2d setTransform带有关节的多个物体