我想滚动通过前后按钮数组。我在网上找不到关于它的任何东西,或者一些对我没有帮助的东西。我想在我方便的时候在按钮事件中调用一个方法。我的代码不起作用,因为它会立即显示数组的最后一个元素,而不是前面的元素后面的元素。我应该试试这个吗 HashMap
或者 ListIterator
还是另一门课?我已经试过listiterator类,但效果不好。
avanti.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String p1 = "SELECT * FROM Cherubini WHERE lemma LIKE '", p2 = "%';",
px = Lemma.getText(), query = p1+px+p2;
int n = main.IdCorrente("SELECT ID FROM Cherubini WHERE definizione = ?", definizione.getText());
String[] output = new String[2000000];
try {
Statement pstmt = null; ResultSet rs = null;
pstmt = main.conn().createStatement(); //
rs = pstmt.executeQuery(query);
while(rs.next()) { output[0] = rs.getString("lemma");
System.out.println(output[0]);
output[1] = rs.getString("definizione");
System.out.println(output[1]);
}
} catch(SQLException exc) {}
lemma.setText(output[0]);
definizione.setText(output[1]);
output = null;
}
});
我的活动是两件一件的:
Lemma.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
String p1 = "SELECT * FROM Cherubini WHERE lemma LIKE '", p2 = "%';",
px = Lemma.getText(), query = p1+px+p2;
ListIterator<String> itr = null;
try {
PreparedStatement pst = main.conn().prepareStatement(query);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
String[] out = {rs.getString("lemma"), rs.getString("definizione")};
results.add(out);
}
} catch (SQLException e1) {}
// here I want set next event and prev event
}
});
1条答案
按热度按时间kgsdhlau1#
String p1 = "SELECT * FROM Cherubini WHERE lemma LIKE '", p2 = "%';",
这是非常不安全的,而且会让你的电脑被一个有进取心的俄国人或者其他什么人拥有。你不能这样做。你必须使用PreparedStatement
,并使用ps.setString(1, p2)
. 如果你不相信我,试着进去Joe'; TRUNCATE Cerubini; --
为了好玩。我要马上讨论这个论点,因为我经常听到这样的说法:“但只有可信的人才能在这个东西中输入文本”–啊,但你看,意外是可能发生的,人们可以被社会工程,在文本字段中输入危险的东西,因为你的普通用户可能不知道sql或钓鱼尝试是什么样子),或者“我只是在学习”——好吧,那你为什么要学习一些会让你被炒鱿鱼甚至被起诉的东西呢?
while(rs.next()) { output[0] = rs.getString("lemma");
这段代码将循环遍历select语句找到的每一行,并覆盖select语句中的第一个槽output
数组。这个代码显然就是问题所在。你想怎么做就怎么做。} catch(SQLException exc) {}
别这样。我当然不想解释为什么这是一个非常糟糕的主意。如果您不知道如何处理异常,那么默认的“i dunno”代码是throw new RuntimeException("uncaught", e);
所以至少,把它放在你的{}
相反。一般问题
您的代码不是特别清楚,但我猜您希望显示数据库中的第一个结果,然后等待用户按一些按钮来显示其余的结果。
你有两种主要的方法,你需要选择一种合适的方法:
选项1-全部查询,缓存。
在这个选项中,您可以查询所有的数据,并将其全部存储起来(不能一直覆盖)
output
,将其放入列表或诸如此类的内容中,然后使用按钮向上或向下修改索引变量,并使用该条目更新图形。比如:选项2-继续查询
选项1的问题是,如果数据库中有一百万条记录,则需要大量的ram来存储所有这些结果,而且加载所有这些记录可能需要很长时间。相反,您也可以在每次按下next按钮时继续查询db。
首先,唯一正确的方法是确保数据库一致地返回相同的结果,这意味着您需要一个
ORDER BY
关于那件事的条款。然后在按下next时,您需要分离一个单独的线程或spring worker来执行查询,然后您需要更新ui以显示“进行中”(禁用所有按钮、显示微调器图形或诸如此类)。对于选项1,您也不能避免它,因为您应该在初始查询期间这样做。
这个单独的线程使用例如。
OFFSET ? LIMIT 1
以及.setInt(2, idx)
获取正确的行,然后使用。SwingUtilities.invokeLater
跑lemma.setText
一旦结果进入,同样的invokelater代码应该删除所有的ui更新以显示数据正在被加载(删除微调器并重新启用ui元素等等)。