我正在创建一个具有文本字段和列表的组件,其中会侦听文本字段中的键入类型,因此生成结果集并将其添加到列表中。 当我擦除键入的键并键入新键时它不起作用。结果集不会再次相应地获取。怎么办?
代码:
@Override
public void keyTyped(KeyEvent ke) {
searchstring = searchstring + ke.getKeyChar();
System.out.println(searchstring);
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException ex) {
System.out.println(ex.toString());
}
try {
Connection con = DriverManager.getConnection(url+databasename,username,password);
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
String s = "select "+columnname+" from "+tablename+" where "+columnname+" like "+"'"+searchstring+"%"+"'";
System.out.println(s);
ResultSet rs = st.executeQuery(s);
list.removeAll();
while(rs.next()){
System.out.println(rs.getString(1));
list.add(rs.getString(1));
}
}catch(Exception ex){
System.out.println(ex.toString());
}
}
答案 0 :(得分:0)
您不断将类型字符附加到搜索字符串:
searchstring = searchstring + ke.getKeyChar();
由于此类搜索将在您键入时不断更改 - 无论是在键入时,还是使用后退空格来擦除字段。最后searchstring
将与您在数据库中的任何内容都不匹配。这就是为什么列表不会改变!
不是修改searchstring
,而是创建另一个变量来附加密钥char,并在查询的where子句中使用该值。
注意:这种向查询附加用户输入的方式会打开您的应用程序以进行SQL注入攻击。您应该使用预准备语句来保护您的应用免受SQL注入攻击。
答案 1 :(得分:0)
这种情况正在发生,因为您的searchString因为要添加的所有键字符或退格键而受到污染。所以替换
searchstring = searchstring + ke.getKeyChar();
与
searchstring = yourTextField.getText() + ke.getKeyChar();
希望这有帮助。
答案 2 :(得分:0)
我解决了这个问题。发现我的新答案代码,因为在此答案之前,这里给出的答案都不完全正确,以及将来可能面临同样问题的其他人的参考。 我现在处理 keyReleased 事件而不是keyTyped事件。在每个keyrelease上,使用textfield的 getText()方法更新serachstring。 getKeyChar()会污染搜索字符串,因为它也会跟踪退格字符。 我使用此逻辑的组件是使用JFC设计的桌面软件组件,其工作方式类似于使用AJAX获取数据的Google搜索文本框。这里的区别在于这是一个桌面软件而不是动态网页。我没有在JFC中找到任何这样的内置组件。因此我使用了一个JTextfield组件和awt List组件togather。它现在完美地工作。 对代码的批评是最受欢迎的。
代码:
@Override
public void keyReleased(KeyEvent ke) {
searchstring = enterstring.getText();
char[] searcharray = searchstring.toCharArray();
if(searcharray.length==0){
list.setVisible(false);
}
else{
list.setVisible(true);
}
System.out.println(searchstring.length());
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException ex) {
System.out.println(ex.toString());
}
try {
Connection con = DriverManager.getConnection(url+databasename,username,password);
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
String s = "select "+columnname+" from "+tablename+" where "+columnname+" like "+"'"+searchstring+"%"+"'";
System.out.println(s);
list.removeAll();
ResultSet rs = st.executeQuery(s);
while(rs.next()){
System.out.println(rs.getString(1));
list.add(rs.getString(1));
}
}catch(Exception ex){
System.out.println(ex.toString());
}
}