从数据库中获取数据但不在Java中填充具有正确数据的文本框

时间:2012-05-20 19:30:45

标签: java

我正在创建一个银行应用程序,我可以使用搜索文本字段来查找数据库中的客户(我正在使用MySQL数据库)。当我输入一个字母来搜索客户的姓氏时,应用程序会从数据库中提取数据并在JList中显示结果。在我的情况下,我的数据库中总共有5条记录,其中4个姓氏以字母“S”开头,一个以字母“M”开头。一旦行或结果在JList中,我就可以单击一行并自动用正确的信息填充名字,姓氏,城市等文本字段。但是,我有两个问题:

  1. 在我的情况下,如果我用字母“S”搜索姓氏,我的JList将只显示数据库中的4条记录,这是正确的。当我从JList中选择一行时,它应该使用适当的信息自动填充所有文本字段。但是,如果我选择JList中的第一行,我的文本字段将始终填充JList中最后一行的信息。我在JList中选择哪一行并不重要,文本字段总是填充最后一行的信息。

  2. 如果我搜索字母“S”,我会得到4条记录,这是正确的。但是,当应用程序仍在运行时,我决​​定搜索字母“M”,我得到一条记录,这也是正确的,但如果我再次尝试搜索字母“S”,我只会得到一条记录。为什么?它应该是4。

  3. 这是我想要完成的事情: Bank Application link

    以下是我的代码的一部分:

        // function that will search for records in the database
        private void searchRecord(){
            try {
    
                connect = DriverManager.getConnection(url,user,password);
                SQLStatement = connect.createStatement();
                Class.forName("com.mysql.jdbc.Driver");
                model.clear();
                String select = "SELECT * FROM customerinfo WHERE LastName LIKE '"+ txtSearch.getText().trim() +"%'";
                rows = SQLStatement.executeQuery(select);
    
                while(rows.next()){
                    //model.addElement(rows.getString("LastName"));
                    model.addElement(rows.getString("LastName") + ", " + rows.getString("FirstName") + " " + rows.getString("MiddleInitial") + ".");
                }
    
                rows.close();
                SQLStatement.close();
                connect.close();
            } catch (ClassNotFoundException e) {
                JOptionPane.showMessageDialog(this, "Where is your Mysql JDBC Driver?");
                e.printStackTrace();
            } catch (SQLException e){
                JOptionPane.showMessageDialog(this, "SQLException: " + e.getMessage());
                JOptionPane.showMessageDialog(this, "VendorError: " + e.getErrorCode());
            }
    
        }
    
        // Implement Action Listener
        private class handler implements ActionListener{
    
            @Override
            public void actionPerformed(ActionEvent event) {
                // if user clicks on New Customer Button, do the following...
                if(event.getSource() == newCustomer){
                    checkForEmptyFields();
                    insertDatabase();
                    clearFields();
                } else if(event.getSource() == update){
                    checkForEmptyFields();
                    updateDatabase();
                    clearFields();
                } else if(event.getSource() == remove){
                    checkForEmptyFields();
                    deleteRecord();
                    clearFields();
                } else if(event.getSource() == cancel){
                    clearFields();
                } else if(event.getSource() == open){
    
                } else if(event.getSource() == search){
                    searchRecord();
                } 
    
            }
        }
    
        // function that will set the text fields
        private void setTextFields(int customerID, String firstName, String lastName, String middleInitial, String street, String city, String state, int zipCode, int phone, String email){
            String convertCustomerID = Integer.toString(customerID);
            txtCustomerID.setText(convertCustomerID);
            txtFirstName.setText(firstName);
            txtLastName.setText(lastName);
            txtMiddleInitial.setText(middleInitial);
            txtStreet.setText(street);
            txtCity.setText(city);
            txtState.setText(state);
            String convertZipCode = Integer.toString(zipCode);
            txtZip.setText(convertZipCode);
            String convertPhone = Integer.toString(phone);
            txtPhone.setText(convertPhone);
            txtEmail.setText(email);
        }
    
        // Implement List Selection Listener
        private class listener implements ListSelectionListener{
            @Override
            public void valueChanged(ListSelectionEvent event) {
                        try {
                            connect = DriverManager.getConnection(url,user,password);
                            SQLStatement = connect.createStatement();
                            String select = "SELECT * FROM customerinfo WHERE LastName LIKE '"+ txtSearch.getText().trim() + "%'";
                            rows = SQLStatement.executeQuery(select);
    
                            if(!event.getValueIsAdjusting()){
    
                                        while(rows.next()){
                                            setTextFields(rows.getInt("CustomerID"), rows.getString("FirstName"), rows.getString("LastName"), rows.getString("MiddleInitial"),
                                                rows.getString("Street"), rows.getString("City"), rows.getString("State"), rows.getInt("ZipCode"), rows.getInt("Phone"),
                                                rows.getString("Email"));
                                        }
    
                                }
    
                        } catch(Exception ex) {
                            JOptionPane.showMessageDialog(null, "Cannot get field values");
                        }
            }
    
        }
    

    必须是rows.next(),它给出了我的问题编号1. rows.next()遍历数据库中的所有记录,并且在完成所有记录之后,它似乎保持不变在最后的记录。不知何故,我需要重置位置,当我点击JList中的一行时,它应该等于具有相同值的行,并用适当的信息填充所有文本字段。

    我已经尝试了一切,此时我放弃了!请帮我!谢谢!

1 个答案:

答案 0 :(得分:0)

valueChanged方法中的SELECT语句将再次选择所有内容。您需要使其仅选择所需的记录。因此,您需要有一种方法来识别列表中所需的行(如客户编号或其他内容),然后在响应选择事件时在SELECT语句中使用该行以仅获得单个客户。