使用下一步按钮JAVA显示ResultSet中的每个记录

时间:2018-04-18 18:40:50

标签: java mysql arrays jdbc

我正在试图浏览并显示从我的SQL语句中检索到的每条记录,然后将它们显示在TextFields中。

我认为我已经接近正确但是它正在显示最后一条记录。

我需要通过点击相同的按钮('下一步')来导航。我怀疑我需要将结果存储到数组中吗?

这是一个库存管理系统,只是为了将其置于上下文中。

感谢您提供的任何帮助:)

JAVA:

// Stock Search ActionListener 
            submit.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    try{
                    Class.forName(DRIVER);
                    // Connection to the Database
                    con = DriverManager.getConnection(DATABASE_URL,"root","");

                    // Gets text from textfields and assigns them to variables
                    s1 = tfKeywords.getText();
                    // Gets ComboBox Selected Item
                    s2 = (String)cb.getSelectedItem();

                    //Creates Statement Connection
                    Statement st = con.createStatement();   

                    // SQL Statements 
                    st.executeQuery("SELECT * FROM "+s2+" WHERE Title LIKE '%"+s1+"%'");

                    // Extracts data from statement to a result set
                    ResultSet rs = st.getResultSet();

                    while (rs.next()) {
                        tfResultsTitle.setText(rs.getString("Title"));
                        tfResultsReleaseT.setText(rs.getString("ReleaseType"));
                        tfResultsType.setText(rs.getString("Type"));
                        tfResultsGenre.setText(rs.getString("Genre"));
                        tfResultsPrice.setText(rs.getString("Price"));
                        tfResultsDeal.setText(rs.getString("Deal"));
                        tfResultsInStock.setText(rs.getString("InStock"));
                        tfResultsLastRec.setText(rs.getString("LastRec"));
                        tfResultsLastSold.setText(rs.getString("LastSold"));
                        tfResultsBarcode.setText(rs.getString("Barcode"));
                    }

                    }

                    // SQL Catch block to catch errors
                    catch(SQLException s){
                    }
                    // Catch block to catch ActionListener errors
                    catch (Exception e1){   
                    } 
                };   
            });

1 个答案:

答案 0 :(得分:0)

alawys之所以只是显示最后一个条目的原因是因为你很好地告诉它。对rs.next()的调用设置了一个指向下一行的内部指针(如果可用),并且在有条目的情况下返回一个布尔值。

现在我们如何解决您的问题。我可以直接思考两种可能性。首先,您可以创建一个新按钮( Next )来处理ResultSet。这种方式的工作方式是你有一个按钮用于请求一个新的Resultset(连接到数据库),然后隐藏这个按钮,然后显示下一个按钮,直到每一个完成并且然后再次交换它们(就可见性而言)。

我更喜欢自己的另一个解决方案看起来与此相似:

private ResultSet results = null;

 submit.addActionListener(new ActionListener()
 {
     public void actionPerformed(ActionEvent e)
     {
         // if there isn't any ResultSet or the current one is empty/done
         if(results == null || !results.next()) 
         {

             try{
             Class.forName(DRIVER);
             // Connection to the Database
             con = DriverManager.getConnection(DATABASE_URL,"root","");

             // Gets text from textfields and assigns them to variables
             s1 = tfKeywords.getText();
             // Gets ComboBox Selected Item
             s2 = (String)cb.getSelectedItem();

             //Creates Statement Connection
             Statement st = con.createStatement();   

             // SQL Statements 
             st.executeQuery("SELECT * FROM "+s2+" WHERE Title LIKE '%"+s1+"%'");

             // Extracts data from statement to a result set
             results = st.getResultSet();
             if(results.next())
             {
               setTexts(results);
             }

             }

             // SQL Catch block to catch errors
             catch(SQLException s){
             }
             // Catch block to catch ActionListener errors
             catch (Exception e1){   
             }   
         }else 
         {
              setTexts(results);
         }
     };   
 });

这是如何工作的?它只是存储最新的ResultSet,并且只在没有ResultSet或当前完成的情况下才会对数据库发出调用。
但是为什么我们可以调用我们的方法来将数据打印到文本字段而不再在else块中再次调用results.next()

在致电if(.. || !rs.next())时,我们已经调用next()已经将内部指针设置为正确的条目。

编辑: setTexts(ResultSet rs)方法如何/应该如何显示:

public void setTexts(ResultSet rs) 
{
    tfResultsTitle.setText(rs.getString("Title"));
    tfResultsReleaseT.setText(rs.getString("ReleaseType"));
    tfResultsType.setText(rs.getString("Type"));
    tfResultsGenre.setText(rs.getString("Genre"));
    tfResultsPrice.setText(rs.getString("Price"));
    tfResultsDeal.setText(rs.getString("Deal"));
    tfResultsInStock.setText(rs.getString("InStock"));
    tfResultsLastRec.setText(rs.getString("LastRec"));
    tfResultsLastSold.setText(rs.getString("LastSold"));
    tfResultsBarcode.setText(rs.getString("Barcode"));
}