如何使用 JPA 将 Java 日期存储到 Mysql 日期时间

Posted

技术标签:

【中文标题】如何使用 JPA 将 Java 日期存储到 Mysql 日期时间【英文标题】:How to store Java Date to Mysql datetime with JPA 【发布时间】:2011-01-24 22:47:58 【问题描述】:

谁能告诉我如何将 Java 日期存储到 mysql 日期时间...?

当我尝试这样做时...仅存储日期,时间保持为 00:00:00 在这样的Mysql日期存储中......

2009-09-22 00:00:00

我不仅想要日期,还想要时间......就像

2009-09-22 08:08:11

我使用 JPA(Hibernate) 和 spring mydomain 类使用 java.util.Date 但我使用手写查询创建了表...

这是我的创建声明

CREATE TABLE ContactUs (
  id BIGINT AUTO_INCREMENT, 
  userName VARCHAR(30), 
  email VARCHAR(50),
  subject VARCHAR(100), 
  message VARCHAR(1024), 
  messageType VARCHAR(15), 
  contactUsTime DATETIME,
  PRIMARY KEY(id)
);

【问题讨论】:

你的代码片段,也许? 链接:coderanch.com/t/304851/JDBC/java/… 这些天你根本不应该再使用java.util.Date(在2010年可能没有更好的选择)。最好使用现代类,例如 java.time.Instantjava.time.LocalDateTime,具体取决于您需要存储的日期时间的确切要求。 其中一些旧答案在 Google 排名中排名很高。在 Java 8+ 中,我们可以简单地使用 LocalDateTime 来保存日期时间,而不是使用 @Temporal 来保存日期时间格式 preparedStatement.setTimestamp(1, new Timestamp(System.currentTimeMillis())); 【参考方案1】:

见链接:

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

下面的代码刚刚解决了这个问题:

java.util.Date dt = new java.util.Date();

java.text.SimpleDateFormat sdf = 
     new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String currentTime = sdf.format(dt);

此“currentTime”已插入到类型为 DateTime 的列中,并且插入成功。

【讨论】:

但是,currentTime 是一个 String 对象,在 db 中我们将 datetime 作为数据类型,我认为它不会被插入。对吧? yyyy-MM-dd HH:mm:ss 非常重要。注意大小写。【参考方案2】:

使用 @Temporal(TemporalType.TIMESTAMP) 注释您的字段(或 getter),如下所示:

public class MyEntity 
    ...
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date myDate;
    ...

这应该可以解决问题。

【讨论】:

这就是答案! 为此,这是正确的答案。 请注意,如果您选择此解决方案,您的日期将在从 db 获取时显示为时间戳。它不会有很好的格式'yyyy-MM-dd ....')【参考方案3】:

您可能在使用java.sql.Date 吗?虽然它作为 Java 类具有毫秒粒度(它是 java.util.Date 的子类,错误的设计决策),但 JDBC 驱动程序会将其解释为没有时间组件的日期。您必须改用java.sql.Timestamp

【讨论】:

我不会在域类中使用java.sql.Datejava.sql.Timestamp,但我想这是在编辑OP 之前编写的。 我愿意。 java.util.Date 对象与 java.sql.Timestamp 对象相比,结果完全可预测。【参考方案4】:

可能是因为您的 java 日期格式与 mysql format (YYYY-MM-DD HH:MM:SS) 不同

这样做

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));

【讨论】:

您在参考文献中提到了正确的格式,然后在代码中使用了错误的格式。【参考方案5】:

你会得到 2011-07-18 + 时间格式

long timeNow = Calendar.getInstance().getTimeInMillis();
java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
...
preparedStatement.setTimestamp(TIME_COL_INDEX, ts);

【讨论】:

【参考方案6】:

mysql 日期时间 -> GregorianCalendar

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2012-12-13 14:54:30"); // mysql datetime format
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
System.out.println(calendar.getTime());

GregorianCalendar -> mysql 日期时间

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String string = format.format(calendar.getTime());
System.out.println(string);

【讨论】:

【参考方案7】:
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);

【讨论】:

【参考方案8】:

使用以下代码将日期插入 MySQL。我们可以通过设置STR_TO_DATE(?, '%l:%i %p')参数来帮助数据库识别我们的日期,而不是改变我们的日期格式以满足MySql的要求。

例如,2014-03-12 可以表示为STR_TO_DATE('2014-03-12', '%Y-%m-%d')

preparedStatement = connect.prepareStatement("INSERT INTO test.msft VALUES (default, STR_TO_DATE( ?, '%m/%d/%Y'), STR_TO_DATE(?, '%l:%i %p'),?,?,?,?,?)"); 

【讨论】:

【参考方案9】:

虽然此答案中的条件在 mysql 中非常简单,但 列数据类型为 datetime 并且您希望将数据从 java 代码发送到 mysql:

java.util.Date dt = new java.util.Date();whatever your code object may be.setDateTime(dt);

重要的是选择日期,它的格式已经按照mysql格式发送,不需要进一步修改。

【讨论】:

【参考方案10】:

其实你可能不会用SimpleDateFormat,你可以用这样的东西;

  @JsonSerialize(using=JsonDateSerializer.class)
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy HH:mm:ss")
  private Date blkDate;

这样可以直接获取指定格式的日期。

【讨论】:

【参考方案11】:

我还是更喜欢一行的方法

new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime())

【讨论】:

【参考方案12】:

对我有用!!

在mysql表中

DATETIME

在实体中:

private Date startDate;

进行中:

objectEntity.setStartDate(new Date());

在preparedStatement中:

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));

【讨论】:

以上是关于如何使用 JPA 将 Java 日期存储到 Mysql 日期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jpa 在 mysql 中存储 java 对象?

如何在 Oracle 中使用 JPA 存储日期和时间?

日期时间JPA映射

如何使用 JPA 持久化 LocalDate?

使用 Spring Boot 和 JPA 将存储过程输出到 Java 自定义对象中

如何从 Java 和 JPA 调用存储过程