在我的电子邮件管理系统中,我正在从MySQL数据库中检索数据到Java netbeans。但它只显示一个人的数据。它应该继续到每个rs.next()的下一行,但它看起来并不像。下面的代码写在“下一步”按钮中,该按钮移动到JList中的下一个选择。
try {
DefaultListModel model = new DefaultListModel();
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/email management system","root", "ok" );
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from inbox,curlogin where inbox.rmail like curlogin.mail;");
String fname="";
list.setSelectedIndex((list.getSelectedIndex()+1));
rs.next();
fname = rs.getString("name");
String sender = rs.getString("First");
String reciever = rs.getString("recipent");
String sub = rs.getString("subject");
String msg = rs.getString("message");
String mail = rs.getString("Email");
Date d = rs.getDate("Date");
Timestamp ls = rs.getTimestamp("Seen");
Time t = rs.getTime("Time");
subject.setText(sub);
message.setText(msg);
date.setText(""+d);
time.setText(""+t);
lseen.setText(""+ls);
email.setText(mail);
// TODO add your handling code here:
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(inbox.class.getName()).log(Level.SEVERE, null, ex);
}
答案 0 :(得分:1)
user2642282的答案在技术上是正确的,但缺乏解释,用户2642282误解了您的尝试。使用您的代码到解决方案的一半但需要进行一些更改。让我们从这开始:
rs.next()
你在这里做的是访问结果集,通常你会编写这样的代码来遍历所有返回的结果:
ResultSet rs = stmt.executeQuery("your SQL statement here");
while (rs.next()) {
fname = rs.getString("name");
//...all your original code here
email.setText(mail);
}
注意代码与原始代码基本完全相同,只是我们添加了while循环。通常,这将允许您写出,显示或存储查询返回的每条记录(在这种情况下为电子邮件),但您希望/需要做一些不同的事情。因此,我将解释我认为您接下来会有哪些选项,但首先会here is a link to the Java Docs解释您需要了解上述代码的所有内容。
选项1 - 传统方式
大多数电子邮件桌面应用程序处理此问题的方法只是加载所有电子邮件并将其存储在文件系统上。这意味着您需要更改代码以在特定时间加载所有电子邮件。也许在启动时,然后每隔60秒检查一次新消息(通常你应该将检查限制在不低于5分钟)。然后,当用户打开一条消息时,您可以从其文件中加载它。当他们按下一个或上一个时,您只需从文件系统加载下一个或上一个电子邮件。因此,您的电子邮件应用程序更像是一个文件阅读器,可以解析电子邮件文件并将其内容加载到您的窗口您还需要设计文件系统。例如,将电子邮件命名并保存为时间戳,以便于查找下一封和之前的电子邮件。您还必须处理已删除的电子邮件。
选项2 - 简单但不良的做法
无需更改代码,您可以跟踪上次读取的数据库中的哪一行,并在每次用户按下下一个或上一个按钮时运行SQL查询。您将使用最初发布的相同代码,但添加以下内容:
选项3 - 混合
您可以尝试将代码更改为我向您展示的代码并执行选项2的混合。您要做的是跟踪数据库中的下一行和前10行。所以,让我们说你上次从第50行阅读。你将运行我给你的代码并保存第40行到第60行的所有电子邮件。你有两个保存电子邮件的选项:
编辑 - 回答评论中的问题
下面是我想象你的代码使用选项2或3的方式。注意......意味着我遗漏了你已经拥有的代码,但这只会妨碍这个例子:
int lastRowRead = 0; // starts as 0 when the program starts
//...all your original code here
ResultSet rs = stmt.executeQuery("...LIMIT "+ lastRowRead +",20;");
if(rs.next()!=false) {
fname = rs.getString("name");
//...all your original code here
email.setText(mail);
}
此代码用于选项3. int lastRowRead应该是一个全局变量,您可以在每次运行查询时跟踪和更改以获取更多消息。您需要弄清楚如何捕获错误,例如尝试查询不存在的行号。我不会帮你编码,因为这是一个很好的学习机会。 注意:如果你不熟悉SQL LIMIT,这是另一个例子:
....LIMIT 40, 20;
这意味着转到表格中的第40行并阅读接下来的20行。所以它会返回40到60的电子邮件。所以如果你想要超级简单但不是有效的路径你的SQL查询可能有:
...LIMIT 40, 1;
这只会返回请求的行号。因此,您所要做的就是跟踪上次读取的行,并从中添加或减去1并再次运行查询以获取下一封或上一封电子邮件。
答案 1 :(得分:0)
您缺少循环遍历结果集的循环。电话
rs.next()
为您提供SQL结果的第一行。尝试循环使用结果,直到rs.next()
返回false
答案 2 :(得分:0)
两点:
一:如果JList当前选中的值没有改变,当你点击下一个按钮时,你应该改变你的sql,然后你可以逐个看到一个人的电子邮件。在你的SQL结束时,你应该添加
select * from inbox,curlogin where inbox.rmail like curlogin.mail limit #{offset} 1
修复你的sql。偏移量是从0,1,2,3开始的......它代表一个人从1到N的电子邮件
二:在选择的值更改后,您没有显示有关JList的一些事件代码。如果它被更改,您应该获取所选项目,并将其传递给您的SQL以过滤人员的电子邮件。所以你的sql应该接受人的名字。