Почему не все мои данные из базы данных отображаются в моем JTextField

#java #mysql #database

#java #mysql #База данных

Вопрос:

У меня есть огромная программа, но моя кнопка «найти товар» не отображает цены на каждый товар, введенный в JTextField описания, выходные данные показывают только одну строку из базы данных и игнорируют другие строки из базы данных.

У меня возникла другая проблема с моей кнопкой «Добавить клиента», почему мои новые данные, вставленные в JTextFields, не сохраняются в фактической базе данных, которая у меня есть?

Вот мой код:

  package electronic.invoice.entry;

 import java.awt.*;
 import java.awt.event.*;
 import java.sql.*;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.swing.*;

 public class ElectronicInvoiceEntry extends JFrame implements 
     ActionListener 
  {
    JLabel Name = new JLabel("Name");
    JTextField name = new JTextField(20);
    JTextfield Address = new JLabel("Address");
    JTextField address = new JTextField(20);
    JLabel City = new JLabel("City");
    JTextField city = new JTextField(20);
    JLabel Description = new JLabel("Description");
    JTextField description = new JTextField(20);
    JLabel Province = new JLabel("Province");
    JTextField province = new JTextField(20);
    JLabel Zip = new JLabel("Zip");
    JTextField zip = new JTextField(20);
    JLabel ProductCode = new JLabel("Product Code");
    JTextField productcode = new JTextField(20);
    JLabel Invoice = new JLabel("Invoice Number");
    JTextField invoice = new JTextField(20);
    JLabel CustomerNum = new JLabel("Customer Number");
    JTextField customernum = new JTextField(20);
    JLabel ProductBought = new JLabel("Product Bought");
    JComboBox productbought = new JComboBox();
     JLabel Quanity = new JLabel("Quanity");
     JTextField quanity = new JTextField(20);
     JLabel Payment = new JLabel("Payment");
     JTextField payment = new JTextField(20);
     JLabel Price = new JLabel("Price");
     JTextField price = new JTextField(20);
     JLabel Deposit = new JLabel("Deposit");
     JTextField deposit = new JTextField(20);
     JLabel AllProducts = new JLabel("All Products: ");
     JComboBox allProducts = new JComboBox();
     JButton AddCustomer = new JButton("Add Customer");
     JButton FindProduct = new JButton("Find Product");
     JButton ListProduct = new JButton("List Product");
     JButton AddInvoice = new JButton("Add Invoice");
     JButton ShowInvoice = new JButton("Show Invoice");
     JButton Exit = new JButton("Exit");
     JButton WriteInvoice = new JButton("Write Invoice");
     JButton Next = new JButton("Next");

public ElectronicInvoiceEntry() {
    super.setTitle("Electronic Invoice Entry");
    super.setBounds(500, 200, 500, 450);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel pane = new JPanel();
    pane.setLayout(new GridLayout(0, 2));
    pane.setBackground(Color.cyan);
    this.getContentPane().add(pane);

    pane.add(Name);
    pane.add(name);
    pane.add(Address);
    pane.add(address);
    pane.add(City);
    pane.add(city);
    pane.add(Description);
    pane.add(description);
    pane.add(Province);
    pane.add(province);
    pane.add(Zip);
    pane.add(zip);
    pane.add(ProductCode);
    pane.add(productcode);
    pane.add(Invoice);
    pane.add(invoice);
    pane.add(CustomerNum);
    pane.add(customernum);
    pane.add(ProductBought);
    pane.add(productbought);
    pane.add(Quanity);
    pane.add(quanity);
    pane.add(Payment);
    pane.add(payment);
    pane.add(Price);
    pane.add(price);
    pane.add(Deposit);
    pane.add(deposit);
    pane.add(AllProducts);
    pane.add(allProducts);
    pane.add(AddCustomer);
    pane.add(FindProduct);
    pane.add(ListProduct);
    pane.add(AddInvoice);
    pane.add(ShowInvoice);
    pane.add(Exit);
    pane.add(WriteInvoice);
    pane.add(Next);

    this.setVisible(true);

    AddCustomer.addActionListener(this);
    ListProduct.addActionListener(this);
    ShowInvoice.addActionListener(this);
    WriteInvoice.addActionListener(this);
    FindProduct.addActionListener(this);
    AddInvoice.addActionListener(this);
    Exit.addActionListener(this);
    Next.addActionListener(this);

    AddCustomer.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            try {
                    Class.forName("com.mysql.jdbc.Driver"); 
                    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/orion", "root", "");
                    System.out.println("Connection"   conn);
                    Statement st = conn.createStatement();
                    String query = ("INSERT INTO `customer`(`Customer_Number`, `Name`, `Address`, `City`, `Province`, `Zip`, `Deposit`)"
                              " VALUES ('Customer_Number', 'Name', 'Address', 'City', 'Province', 'Zip', 'Deposit')");
                    PreparedStatement ps = conn.prepareStatement(query);

                    ps.setString(1, customernum.getText());
                    ps.setString(2, name.getText());
                    ps.setString(3, address.getText());
                    ps.setString(4, city.getText());
                    ps.setString(5, province.getText());
                    ps.setString(6, zip.getText());
                    ps.setString(7, deposit.getText());

                    ps.execute();

            } catch (ClassNotFoundException ex) {
                Logger.getLogger(ElectronicInvoiceEntry.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, "Saved");
            }   
        }
    });
    ListProduct.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            try {
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/orion", "root", "");
                System.out.println("Connection"   conn);
                Statement st = conn.createStatement();
                ResultSet rs = st.executeQuery("SELECT `Description` FROM `product` ORDER BY Description");

                while(rs.next()) {
                    productbought.addItem(rs.getString("Description")); 
                }
            } catch (SQLException ex) {
                Logger.getLogger(ElectronicInvoiceEntry.class.getName()).log(Level.SEVERE, null, ex);
            }


        }
    });
    ShowInvoice.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

        }
    });
    WriteInvoice.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

        }
    });
    FindProduct.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

           try {
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/orion", "root", "");
                System.out.println("Connection"   conn);
                Statement st = conn.createStatement();
               ResultSet rs = st.executeQuery("SELECT`Description`, `Price` FROM `product` WHERE `Description` IN "
                         "('Toaster','Hair dryer','Car vacuum')");

                while(rs.next()) {
                  description.setText(rs.getString("Description"));
                  price.setText(rs.getString("Price"));

                }
            } catch (SQLException ex) {
                Logger.getLogger(ElectronicInvoiceEntry.class.getName()).log(Level.SEVERE, null, ex);

            }
        }
    });
    AddInvoice.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

        }
    });
    Exit.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    });
    Next.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            try {
                electronicInvoiceEntryTransaction frame = new electronicInvoiceEntryTransaction();
                frame.setVisible(true);
            } catch (Exception ex) {
            }
        }
    });

}//end of constructor

public static void main(String[] args) {
    ElectronicInvoiceEntry e = new ElectronicInvoiceEntry();
}//end of main method

@Override
public void actionPerformed(ActionEvent e) {

}

public class electronicInvoiceEntryTransaction extends JFrame {


        JLabel Name = new JLabel("Name");
        JTextField name = new JTextField(20);
        JLabel CustomerNumber = new JLabel("Customer Number");
        JTextField customernumber = new JTextField(20);
        JLabel Balance = new JLabel("Balance");
        JTextField balance = new JTextField(20);
        JButton CheckBalance = new JButton("CheckBalance");
        JButton Deposit = new JButton("Deposit");
        JButton Calculate = new JButton("Calculate Payment and Deposit");
        JButton Transaction = new JButton("Transaction");

    public electronicInvoiceEntryTransaction() {
        setTitle("Electronic Invoice Entry - Transaction");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(300, 300, 700, 400);
        setVisible(true);
        JPanel pane = new JPanel();
        pane.setLayout(new GridLayout(0, 2));
        pane.setBackground(Color.green);
        this.getContentPane().add(pane);


        pane.add(Name);
        pane.add(name);
        pane.add(CustomerNumber);
        pane.add(customernumber);
        pane.add(Balance);
        pane.add(balance);
        pane.add(CheckBalance);
        pane.add(Deposit);
        pane.add(Calculate);
        pane.add(Transaction);

        CheckBalance.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });
        Deposit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            /* INSERT INTO `account`(`Name`, `Customer_Number`, `Balance`)"
                          " VALUES ('Name','Customer_Number','Balance')*/   
            }
        });
        Calculate.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });
        Transaction.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });
    }//end of constructor
}//end of class electronic transaction

 }//end of main class
  

Комментарии:

1. Ваш запрос find product содержит жестко закодированные значения вместо использования значения из текстового поля description. Цикл набора результатов каждый раз заменяет текст предыдущей записи в текстовых полях значениями из текущей записи. Вы должны собрать все значения и вызвать setText() один раз. Наконец, ваш запрос insert является неподходящим подготовленным выражением, потому что вы должны использовать ? внутри инструкции в качестве заполнителя для значений, которые вы хотите вставить, вызвав ps.setString(1, …)

2. @Palamino В подготовленную инструкцию я добавил «?», но мои новые данные по-прежнему не сохраняются в реальной базе данных, это делает то же самое в моем приведенном выше коде. Для моего запроса find product я не уверен, что вы подразумеваете под сбором значений и вызовом setText() один раз

3. Даже когда я выполняю ps.setString(1, » «), он по-прежнему не добавляет мои данные в базу данных

4. Изменить ваши вставить запрос, чтобы выглядеть строка запроса = «вставить в customer ( Customer_Number , Name , Address , City , Province , Zip , Deposit ) значения (?, ?, ?, ?, ?, ?, ?)»; Затем измените свой код, чтобы установить значения, такие как PS.метод setString(1, customernum.то gettext()); ПС.метод setString(2, «имя».то gettext()); ПС.метод setString(3, «адрес».то gettext()); …и т. д. В блоке catch(SQLException ex) регистрируйте любые исключения, чтобы вы знали, что происходит не так, и вам следует использовать int count = ps.executeUpdate(); и проверять, что count == 1 вместо вызова ps.execute().

5. @Palamino Теперь это сработало ….. я буду помнить это в будущем. Спасибо

Ответ №1:

Измените свой прослушиватель действий FindProduct следующим образом, чтобы собирать описания и цены для всех строк результирующего набора:

 FindProduct.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {

       Connection conn = null;
       try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost/orion", "root", "");
            System.out.println("Connection"   conn);
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("SELECT `Description`, `Price` FROM `product` WHERE `Description` IN ('Toaster','Hair dryer','Car vacuum')");

            StringBuilder sbDesc = new StringBuilder();
            StringBuilder sbPrice = new StringBuilder();
            while(rs.next()) {
                sbDesc.append(rs.getString("Description")).append("rn");
                sbPrice.append(rs.getString("Price")).append("rn");
            }
            description.setText(sbDesc.toString());
            price.setText(sbPrice.toString());
        } catch (SQLException ex) {
            Logger.getLogger(ElectronicInvoiceEntry.class.getName()).log(Level.SEVERE, null, ex);

        }
        finally {
            if(conn != null) {
                try { conn.close(); } 
                catch(Exception e) { Logger.getLogger(ElectronicInvoiceEntry.class.getName()).log(Level.SEVERE, null, e); }
                finally{ conn = null; }
            }
        }
    }
});
  

Комментарии:

1. Я в точности повторил ваш код, и мои выходные данные, когда я набираю «Toaster», отображают все мои цены и товары в своих текстовых полях. он не показывает только одну цену с одним описанием

2. Это потому, что SQL-запрос точно такой же, как ваш исходный вопрос. Вам нужно изменить предложение SQL query WHERE, чтобы выбирать только те критерии, которые вы хотите.

3. Теперь это имеет смысл, спасибо @Palamino