Java Oracle SQL PreparedStatement setdate

Java Oracle SQL PreparedStatement setdate,java,sql,oracle,date,Java,Sql,Oracle,Date,我正在胡思乱想,我找不到解决这个问题的好办法,我搜索了一些其他的话题,但仍然没有任何想法。我对准备好的报表有问题,特别是在确定日期方面。我知道,oracle Date需要YYYY/MM/DD格式的日期和YYYY-MM-DD格式的java.sql.Date,但这些方案都不能很好地工作 String query = "INSERT INTO STUDENTS VALUES (?,?,?,?,?,?,?,?)"; PreparedStatement statement = c

我正在胡思乱想,我找不到解决这个问题的好办法,我搜索了一些其他的话题,但仍然没有任何想法。我对准备好的报表有问题,特别是在确定日期方面。我知道,oracle Date需要YYYY/MM/DD格式的日期和YYYY-MM-DD格式的java.sql.Date,但这些方案都不能很好地工作

 String query = "INSERT INTO STUDENTS VALUES (?,?,?,?,?,?,?,?)";
            PreparedStatement statement = connection.prepareStatement(query);
            statement.setInt(1, Integer.parseInt(studentIndex.getText()));
            statement.setString(2, studentName.getText());
            statement.setString(3, studentLastName.getText());
            statement.setDate(4, Date.valueOf(studentDate.getText()));
            statement.setNString(5, studentSex.getText());
            statement.setString(6, studentCity.getText());
            statement.setString(7, studentMajor.getText());
            statement.setString(8, studentSpeciality.getText());
            ResultSet result = statement.executeQuery();
在JTextField中启动并编写一些示例日期后,例如1999-10-20或1999/10/20,我有一个例外

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException
at java.sql.Date.valueOf(Date.java:143)
at Project$7.actionPerformed(Project.java:166)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
有什么想法吗

编辑:
已解决

尝试使用TO_date的SQL语句显式设置日期格式,例如

String query = "INSERT INTO STUDENTS VALUES (?,?,?,TO_DATE(?,'YYYY-MM-DD'),?,?,?,?)";

然后确保Java变量中的日期格式匹配。如果不同,请根据需要更改TO_DATE中的格式。

不要尝试使用
DATE.valueOf
来解析日期字符串,而应该使用
DateFormat.parse
。它允许您设置一个模式来精确指定日期字符串的格式,以便正确解析。事实上,
SimpleDateFormat
便利类可能就是您所需要的。请参阅文档,不要使用“statement.setDate(4,Date.valueOf(studentDate.getText());”,请使用“statement.setString(4,studentDate.getText());”。我们让Oracle通过TO_日期进行转换,因此我们只需传入字符串。