【问题标题】:Inputting 'Date' from JFrame to MySQL database从 JFrame 输入“日期”到 MySQL 数据库
【发布时间】:2018-11-19 22:22:44
【问题描述】:

(我使用的是 Netbeans IDE 8.2) 我正在制作一个 jFrame 表单来注册一个新用户,该用户将在运行时接受来自用户的一些值,并将它们插入到我在 MySQL 中创建的数据库中。 这是设计视图(忽略右上角的文本框)-

这是我使用 JDBC 编写的代码-

现在,我面临的问题是输入出生日期。它显示了这个错误-

这是数据库和表格-

我从错误中得到的只是 MySQL 不能接受输入的值,我猜这可能是由于一些我不知道的隐式数据转换。我不明白如何解决这个问题。请帮忙 ! (我还没有做任何数据验证)

【问题讨论】:

  • 你应该学习使用绑定变量和准备好的语句有很多原因。接下来你不应该使用Date 类,它早已过时且设计不佳。使用LocalDate,这是代表没有时间的日期的现代类。将其传递给您准备好的声明,您的问题就会消失。
  • 能否将您的代码作为文本发布在问题中(使用{} 按钮将其格式化为代码)?它更容易阅读,并且允许有人对其进行测试并在答案中引用它的相关部分,无论是修改过的还是未修改过的。您也可以在问题中将错误消息引用为文本,而不是发布图片。
  • 你的意思是说我做一个LocalDate类的对象,然后给那个对象传一个值?
  • 我不是从我的电脑上发布这个,所以现在发布代码有点问题
  • 是的,例如this answer。由于您从日期选择器中获取日期,因此您可能需要先进行转换。 jDateChooser1.getDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()(有点罗嗦,但其他方面直截了当)。

标签: java mysql date error-handling netbeans-8


【解决方案1】:

编辑(感谢Ole V.V.的建议)

Date 早已过时且设计不佳,因此更好的选择是LocalDate。话虽这么说,解决方案是使用准备好的语句,并且:

jDateChooser1.getDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

请考虑发布与代码图片相比的实际代码。话虽如此,要将Date 文字插入mysql,它们需要采用here 描述的格式。所以你只需要对日期做更多的操作。让我们使用YYYY-MM-DD。假设您使用的是jDateChooser

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dob = sdf.format(jDateChooser1.getSelectedDate().getTime());

附带说明一下,现在您正在手动构建查询并连接值,这是对 SQL 注入开放的。请考虑使用Prepared Statements

【讨论】:

  • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中做得更好。
  • 下次我会记住这一点。好的,它有效,但我的问题是,在表格中,我将 dob 设置为日期类型,这里 dob 是字符串类型。它如何接受字符串值?是因为 SimpleDateFormat 吗?
  • @Tanz 在问题中的代码中,字符串连接"','" + dob 等也使用其toString 方法将Date 转换为字符串。不同之处在于答案中的代码以 MySQL 接受的格式生成字符串。但是,您仍然应该更喜欢绑定变量,它们将使您摆脱依赖于数据库期望的字符串格式。
  • @OleV.V.谢谢你的建议。我不经常处理日期,所以我只是按照我的想法去做。我会尽快重新审视我的答案,以纳入您的反馈。
猜你喜欢
  • 1970-01-01
  • 2014-11-19
  • 2019-10-31
  • 2019-01-20
  • 2016-04-11
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2013-08-28
相关资源
最近更新 更多