Java 从JSpinner获取日期并将其放入具有日期格式的MySQL数据库列

Java 从JSpinner获取日期并将其放入具有日期格式的MySQL数据库列,java,mysql,swing,simpledateformat,jspinner,Java,Mysql,Swing,Simpledateformat,Jspinner,我正在开发一个java程序,我希望从用户那里输入日期 为此,我使用了一个JSpinner,并从Spinner模型编辑器中将其模型类型设置为Date。 另外,默认情况下,微调器也会显示时间,我不需要时间,只需要日期。因此,我创建了一个新的SimpleDataFormat并应用于微调器。 以下是SimpleDataFormat的代码:- SimpleDateFormat date_format = new SimpleDateFormat("dd-MM-yyyy"); dateSpinner.set

我正在开发一个java程序,我希望从用户那里输入日期

为此,我使用了一个JSpinner,并从Spinner模型编辑器中将其模型类型设置为Date。 另外,默认情况下,微调器也会显示时间,我不需要时间,只需要日期。因此,我创建了一个新的SimpleDataFormat并应用于微调器。 以下是SimpleDataFormat的代码:-

SimpleDateFormat date_format = new SimpleDateFormat("dd-MM-yyyy");
dateSpinner.setEditor(new JSpinner.DateEditor(dateSpinner,date_format.toPattern()));
我使用DateFormat是因为我想以dd-mm-yyyy格式显示日期

之后,我使用stateChanged方法通过JSpinner获取用户选择的日期。 方法主体如下所示:

private void stateChanged(javax.swing.event.ChangeEvent evt) {        

    Date dateChosen = (Date) dateSpinner.getValue();

    int date = dateChosen.getDate();
    int month = ( dateChosen.getMonth() ) + 1;
    int year = ( dateChosen.getYear() ) + 1900;        
    String DB_Date = String.valueOf(year) + "-" + String.valueOf(month) + "-" + String.valueOf(date);

   // 1 was added to **month** because month's were 1 less than the conventional human format
   // also, 1900 was added to **year** to make it suitable for apperance of human conventions

}
PreparedStatement stmt = new PreparedStatement();
stmt.setDate (column_no, (java.sql.Date) dateChosen);
现在,我希望将这个日期从用户输入到我的MySQL数据库列中,该列的数据类型是date。 为此,我尝试了以下方法:- 1.我尝试使用参数为DateSelected的setDate方法,其代码如下:-

private void stateChanged(javax.swing.event.ChangeEvent evt) {        

    Date dateChosen = (Date) dateSpinner.getValue();

    int date = dateChosen.getDate();
    int month = ( dateChosen.getMonth() ) + 1;
    int year = ( dateChosen.getYear() ) + 1900;        
    String DB_Date = String.valueOf(year) + "-" + String.valueOf(month) + "-" + String.valueOf(date);

   // 1 was added to **month** because month's were 1 less than the conventional human format
   // also, 1900 was added to **year** to make it suitable for apperance of human conventions

}
PreparedStatement stmt = new PreparedStatement();
stmt.setDate (column_no, (java.sql.Date) dateChosen);
但是,日期并没有被存储,MySQL表的date列保留为空。 . 2.我尝试使用setString方法,其参数为DB_Date,其代码如下:-

 PreparedStatement stmt = new PreparedStatemnt();
 stmt.setString (column_no, DB_Date);
但是,MySQL表的date列仍然是空的

现在,我想知道如何将JSpinner中的日期存储到数据类型为date的MySQL表列中。 另外,如果除了使用JSpinner在MySQL表中存储日期之外还有其他方法,请告诉我。

JDBC中的日期类型是java.sql.date,而在另一种情况下是java.util.date,它们是不同的,不能直接转换

你可以试试下面的代码

PreparedStatement stmt = new PreparedStatement();
stmt.setDate (column_no, new java.sql.Date(dateChosen.getTime()));
顺便说一句,如果您使用的是java-8和jdbc-4,更合适的方法是使用

java.time 假设您至少可以使用Java 8和JDBC 4.2:

    LocalDate dateToSave = dateChosen.toInstant()
            .atZone(ZoneId.systemDefault())
            .toLocalDate();
    stmt.setObject(column_no, dateToSave);
不要将日期作为字符串保存到MySQL。使用日期对象。当然,我们更喜欢现代的LocalDate,而不是设计有问题的过时的java.sql.Date。请注意使用setObject而不是setDate

在这里,我们无法完全避免老式的java.util.Date类,因为微调器给了我们一个类。您可能想研究是否可以将LocalDate对象填充到微调器中,但我不能确定它不是我的主字段。在本例中,要做的第一件事是将日期转换为现代的Instant类,这样我们就可以使用现代的java日期和时间API java.time完成剩下的工作

不过,我相信您可以避免使用老式的SimpleDataFormat类。只需做简单的事情:

    dateSpinner.setEditor(new JSpinner.DateEditor(dateSpinner, "dd-MM-yyyy"));
最后,由于PreparedStatement是一个接口,而不是一个类,所以您无法执行您尝试的操作:

    PreparedStatement stmt = new PreparedStatemnt(); // Nogo; cannot instantiate the type PreparedStatement

这不在这个问题的范围之内,所以我只想说你需要一个连接。我相信您会发现,如果没有,请提出一个新问题。

谢谢,第一种方法对我很有效。尝试第二种方法时,我得到了错误不兼容的类型:LocalDate无法转换为Date@AlphaSniper第二,你可以检查这个