#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