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

Fetching date from JSpinner and putting in MySQL database column having DATE format

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

为此,我使用了 JSpinner 并将其模型类型设置为来自 Spinner 模型编辑器的 Date
此外,默认情况下,微调器还显示 time ,我不想要时间,但只显示日期,因此,我创建了一个新的 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

}

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

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

但是没有存储日期,MySQL table 的日期列留空。
.
2. 我尝试使用 setString( ) 方法,其参数为 DB_Date,其代码如下:-

 PreparedStatement stmt = new PreparedStatemnt();
 stmt.setString (column_no, DB_Date);

但是,MySQL table 的(日期)列再次留空。

现在,我想知道如何将 JSpinner 中的日期存储到数据类型为 DATE.[= 的 MySQL table 列中43=] 另外,如果除了使用 JSpinner 将日期存储在 MySQL table 中还有其他方法,那么也请告诉我。

JDBC中的Date类型是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());

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 class因为旋转器给了我们一个(你可能想研究一下你是否可以将LocalDate对象填充到旋转器中相反,但这不是我的主场,我说不准)。在这种情况下,首先要做的是将 Date 转换为现代的 Instant class,这样我们就可以使用 java.time、现代的 Java 日期和时间 API.

我相信你 可以 避免使用老式的 SimpleDateFormat class。简单一点:

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

最后,由于 PreparedStatement 是一个接口,而不是 class,您不能做您尝试的事情:

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

不在这个问题之内,所以我只提一下你需要一个Connection。我相信您会发现(如果没有,请提出一个新问题)。