生成结果集一次后,Resultset(java.sql)对象不获取数据

时间:2014-02-17 15:54:54

标签: java mysql jdbc

我正在创建一个具有文本字段和列表的组件,其中会侦听文本字段中的键入类型,因此生成结果集并将其添加到列表中。 当我擦除键入的键并键入新键时它不起作用。结果集不会再次相应地获取。怎么办?

代码:

    @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());

        }



}

3 个答案:

答案 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());

        }

}