如何从数据库中检索日期并转换为日历?

camsedfj  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(524)

我正在用javaswing和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,它给出了解析错误。所以我想知道如何将日期转换成日历??我已经删除了日期代码之后,它给出了当前日期和其他数据加载正常。
还有一个问题。为什么资本金在 SimpleDateFormat("yyyy-MM-dd") ?

lxkprmvk

lxkprmvk1#

您的代码使应用程序易受sql注入攻击

暂时忘掉日期操作,把注意力放在jdbc代码上。你传递价值的方式 sid 在您的查询中,是sql注入工作原理的经典示例。你应该使用 ? 作为参数的占位符,并使用setter方法传递参数。这也将帮助您摆脱显式使用的单引号。了解有关使用的更多信息 PreparedStatement 从本教程。
另外,在处理某些资源(例如db连接、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();
}

现有答案已经为您提供了与日期操作相关的修复。关于您的以下问题,我添加了几个更有用的链接:
还有一个问题。为什么资本金在 SimpleDateFormat("yyyy-MM-dd") ? SimpleDateFormat 评估 M 一年中的一个月 m 一小时一分钟。检查下列文件: SimpleDateFormat 了解有关日期、时间、时区、时区偏移等的各种符号的更多信息。
即使对于解析/格式化api也是如此, DateTimeFormatter 对于现代日期时间类型。

ttisahbt

ttisahbt2#

我想问题是 java.util.Date date = sdf.parse("DOB"); 正在尝试分析字符串 "DOB" ,而不是 DOB 在你的数据库里。 java.util.Date date = sdf.parse(rs.getString("DOB")); 可能会起作用。
您还可以尝试传入一个伪日期字符串(如“2020-12-09”),看看它是否毫无例外地出现在您的gui中,然后找出如何从db中获取字符串以替换伪日期字符串。
abra的评论确实提出了未来可能的改进:大多数数据库都有特定的日期/时间/时间戳类型,您可以使用这些类型,这可能比转换为字符串、存储字符串然后再转换回 Date .

nle07wnf

nle07wnf3#

根据文档,日期数据类型Map到类 java.sql.Date . 所以应该在接口中使用getdate方法 java.sql.ResultSet 检索dob列的值。

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

我猜是的 db1 (在您的问题代码中)是一个jdatechooser,所以您只需要调用方法setdate

db1.setDate(dob);

等等à

1dkrff03

1dkrff034#

java.time文件

我建议您在日期工作中使用java.time,这是一种现代的java日期和时间api。

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

这给你一个现代社会的例子 LocalDate 类型,这是更好的工作比旧的 Calendar 以及 Date 班级。同时,它使您不必进行任何解析。编辑:自JDBC4.2(2014年推出)以来,支持从sql中的日期到localdate的转换(mysql已经实现了很长时间)。现在,您已经为日期选择器更新为java.time或选择更现代的日期选择器的那一天做好了准备。同时,如果你需要 Calendar 对于当前使用的日期选取器,按以下方式转换:

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

还有一个问题。为什么资本金在 SimpleDateFormat("yyyy-MM-dd") ?
不管是否使用现代 DateTimeFormatter 或者是那些老家伙 SimpleDateFormat 或类似的格式化程序,而不是java格式的模式字母区分大小写。如果一个字母的大小写都能用,它们就有不同的含义。例如:
小写 yyyy 表示纪年,大写 YYYY 表示基于周的年份(周数所属的年份,并不总是与日期所属的日历年相同)。通常小写代表最常用的意思。
小写 mm 表示时分,而大写 MM 是一年中的一个月(想想:一个月比一分钟长)。
小写 dd 表示月份的某一天(公历中的1-31),而大写 DDD 表示一年中的某一天(1–366)(想想:一年中的某一天数字通常更大,而且也不太常用)。

链接

oracle教程:date time解释如何使用java.time。
相关问题:将java.time.localdate对象插入sql数据库(如h2)或从中取出
支持java.time的日期选择器示例:lgooddatepicker
关于格式字母之间区别的问题 mm 以及 MM :SimpleDataFormat解析时忽略月份

相关问题