0

我正在使用 Java Swing 和 MySQL 在 Eclipse 中编写代码。我在数据库中使用日历存储出生日期。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String DOB=sdf.format(db1.getDate());

如果用户想要更新,我想从数据库中检索日期并在 GUI 中显示以进行更新。

我怎样才能做到这一点?

String idpop = JOptionPane.showInputDialog(null , "Enter Student ID to update record:");
int sid=Integer.parseInt(idpop);

Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/schl","root","root");

String sql = "select * from stud_info where ID='"+sid+"' ";
PreparedStatement ps=con.prepareStatement(sql);
                      
ResultSet rs = ps.executeQuery();
if(rs.next()) {
                            
                String Sid=rs.getString("ID");
                id1.setText(Sid);
                String Snm=rs.getString("Name");
                nm1.setText(Snm);
                                       
                SimpleDateFormat sdf = new SimpleDateFormat("dd-M-yyyy");
                java.util.Date date = sdf.parse("DOB");
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(date);
                db1.setCalendar(calender);         
                                   
                String Sem=rs.getString("Email");
                em1.setText(Sem);
                String Smb=rs.getString("MobNo");
                mb1.setText(Smb);
                String Saddr=rs.getString("Address");
                addr1.setText(Saddr);
                String Sssc=rs.getString("SSCMrks");
                ssc1.setText(Sssc);
                String Shsc=rs.getString("HSCMrks");
                hsc1.setText(Shsc);        
                       }

在那,我正在尝试更新记录,为此,我通过弹出窗口从用户那里获取 id,然后它正在从数据库中加载数据,但是对于 dob,它给出了解析错误。所以我想知道如何将日期转换为日历?我已经删除了日期代码,之后它给出了当前日期和其他数据加载正常。

4

4 回答 4

3

java.time

我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。

        LocalDate date = rs.getObject("DOB", LocalDate.class);

这为您提供了一个现代LocalDate类型的实例,它比旧的CalendarDate类更易于使用。同时它使您免于任何解析。编辑:自 JDBC 4.2(2014 年推出)以来,支持从 SQL 中的日期到 LocalDate 的转换(现在由 MySQL 实现了很长时间)。您现在已经为日期选择器更新为 java.time 或选择更现代的日期选择器的那一天做好了准备。同时,如果您需要一个Calendar当前正在使用的日期选择器,请像这样转换:

        ZonedDateTime startOfDay = date.atStartOfDay(ZoneId.systemDefault());
        Calendar calendar = GregorianCalendar.from(startOfDay);

还有一个问题。为什么MM是大写的 SimpleDateFormat("yyyy-MM-dd")

无论是使用现代DateTimeFormatter还是旧的和臭名昭著的麻烦SimpleDateFormat或类似的格式化程序,Java 格式模式字母都区分大小写。如果一个字母的大写和小写都可以使用,它们有不同的含义。例如:

  • 小写yyyy表示时代,而大写YYYY表示基于周的年份(周数所属的年份,并不总是与日期所属的日历年相同)。通常小写是最常用的意思。
  • 小写mm表示小时的分钟,而大写MM表示一年中的月份(想想:一个月比一分钟长)。
  • 小写dd代表月份中的某一天(公历中的 1-31),而大写DDD代表一年中的某一天(1-366)(想想:一年中的日期通常更大,而且也不常用)。

链接

于 2020-12-10T03:09:15.720 回答
1

I think the problem is that java.util.Date date = sdf.parse("DOB"); is trying to parse the String "DOB", not the value of DOB in your database.

java.util.Date date = sdf.parse(rs.getString("DOB")); might work instead.

You can also try passing in a dummy date string (like "2020-12-09") to see if that shows up in your GUI, without an exception, and then working to figure out how to get the string from the DB to replace the dummy date string.

Abra's comment does suggest a possible future improvement: most databases have specific date/time/timestamp types you could use instead, which might offer more guarantees than converting to a string, storing a string, and then converting back into a Date.

于 2020-12-09T17:07:01.903 回答
1

您的代码使您的应用程序容易受到SQL 注入的攻击

暂时忘记日期操作,专注于您的 JDBC 代码。您在查询中传递值的方式sid是 SQL 注入如何工作的经典示例。您应该将?其用作参数的占位符并使用 setter 方法传递参数。这也将帮助您摆脱明确使用的单引号。PreparedStatement本教程中了解有关使用的更多信息。

此外,当您处理某些资源(例如数据库连接、I/O 流等)时,请养成使用try-with-resources 语句的习惯。

您的代码应如下所示:

String idpop = JOptionPane.showInputDialog(frame , "Enter Student ID to update record:");
int sid = Integer.parseInt(idpop);

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/schl","root","root");

String sql = "SELECT * FROM stud_info WHERE id =?";

try (PreparedStatement ps = con.prepareStatement(sql)) {

    ps.setString(1, sid); 
    ResultSet rs = ps.executeQuery();

    //...
} catch (SQLException e) {
    e.printStackTrace();
}

现有答案已经为您提供了与日期操作相关的修复。关于您的以下问题,我添加了一些更有用的链接:

还有一个问题。为什么MM是大写的 SimpleDateFormat("yyyy-MM-dd")

SimpleDateFormat评估M为年中的月份,而小时中m分钟。查看文档SimpleDateFormat以了解有关与日期、时间、时区、时区偏移等相关的各种符号的更多信息。

即使对于DateTimeFormatter现代日期时间类型的解析/格式化 API 也是如此。

于 2020-12-21T16:36:38.283 回答
0

根据文档, DATE 数据类型映射到类java.sql.Date。所以你应该在接口中使用方法getDatejava.sql.ResultSet来检索列 DOB 的值。

java.sql.Date dob = rs.getDate("DOB");

我猜db1(在你问题的代码中)是一个JDateChooser,所以你需要做的就是调用方法setDate

db1.setDate(dob);

等等

于 2020-12-09T19:51:14.067 回答