从JSpinner提取日期并放入具有DATE格式的MySQL数据库列

时间:2018-07-14 06:31:44

标签: java mysql swing simpledateformat jspinner

我正在开发Java程序,希望输入用户的日期。

为此,我使用了JSpinner,并在Spinner Model Editor中将其模型类型设置为 Date
另外,默认情况下,微调器还显示时间,并且我不想显示时间,而是仅显示日期,因此,我创建了一个新的 SimpleDateFormat 并将其应用于微调器。
这是SimpleDateFormat的代码:-

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

}

现在,我希望将此日期从用户输入到数据类型为 DATE 的MySQL数据库列中。
为此,我尝试了以下方法:-
 1.我尝试使用 setDate()方法,其参数为 dateChosen ,其代码如下:-

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表中之外,还有其他方法,请也告诉我。

2 个答案:

答案 0 :(得分:1)

Date中的JDBC类型为java.sql.Date,在其他情况下为java.util.Date,它们不一样,不能直接转换

您可以尝试以下代码

PreparedStatement stmt = new PreparedStatement();
stmt.setDate (column_no, new java.sql.Date(dateChosen.getTime()));

顺便说一句,如果您使用的是java-8jdbc-4,则更合适的方法是使用 LocalDate

stmt.setDate (column_no, localDate.now());

答案 1 :(得分:0)

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对象填充到微调器中,但这不是我的主场,我不知道)。在这种情况下,要做的第一件事是将Date转换为现代的Instant类,这样我们就可以使用java.time(现代的Java日期和时间API)完成其余的工作。

不过,我相信您 可以避免使用老式的SimpleDateFormat类。只需简单一些即可:

    dateSpinner.setEditor(new JSpinner.DateEditor(dateSpinner, "dd-MM-yyyy"));

最后,由于PreparedStatement是一个接口,而不是一个类,因此您无法做您尝试做的事情:

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

这个问题不在此范围内,因此我只想提一下您需要一个Connection。我相信您会发现(如果没有,请问一个新问题)。