我正在用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")
?
4条答案
按热度按时间lxkprmvk1#
您的代码使应用程序易受sql注入攻击
暂时忘掉日期操作,把注意力放在jdbc代码上。你传递价值的方式
sid
在您的查询中,是sql注入工作原理的经典示例。你应该使用?
作为参数的占位符,并使用setter方法传递参数。这也将帮助您摆脱显式使用的单引号。了解有关使用的更多信息PreparedStatement
从本教程。另外,在处理某些资源(例如db连接、i/o流等)时,要养成使用try with resources语句的习惯。
您的代码应如下所示:
现有答案已经为您提供了与日期操作相关的修复。关于您的以下问题,我添加了几个更有用的链接:
还有一个问题。为什么资本金在
SimpleDateFormat("yyyy-MM-dd")
?SimpleDateFormat
评估M
一年中的一个月m
一小时一分钟。检查下列文件:SimpleDateFormat
了解有关日期、时间、时区、时区偏移等的各种符号的更多信息。即使对于解析/格式化api也是如此,
DateTimeFormatter
对于现代日期时间类型。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
.nle07wnf3#
根据文档,日期数据类型Map到类
java.sql.Date
. 所以应该在接口中使用getdate方法java.sql.ResultSet
检索dob列的值。我猜是的
db1
(在您的问题代码中)是一个jdatechooser,所以您只需要调用方法setdate等等à
1dkrff034#
java.time文件
我建议您在日期工作中使用java.time,这是一种现代的java日期和时间api。
这给你一个现代社会的例子
LocalDate
类型,这是更好的工作比旧的Calendar
以及Date
班级。同时,它使您不必进行任何解析。编辑:自JDBC4.2(2014年推出)以来,支持从sql中的日期到localdate的转换(mysql已经实现了很长时间)。现在,您已经为日期选择器更新为java.time或选择更现代的日期选择器的那一天做好了准备。同时,如果你需要Calendar
对于当前使用的日期选取器,按以下方式转换:还有一个问题。为什么资本金在
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解析时忽略月份