Java Swing(NetBeans)中基于登录用户实现订单存储与查询
桌面点餐应用订单存储与查询实现方案
我是Java新手,正在使用Swing、NetBeans和MySQL数据库开发一款桌面点餐应用,用户需登录后方可下单。希望将包含order_id、item、price以及当前登录用户patron_id的订单信息存入数据库,并能在后续查询该用户的订单历史。以下是我的相关代码及实现方案:
数据库连接类(dbconnect.java)
package dbconnect; import java.sql.Connection; import java.sql.DriverManager; import javax.swing.JOptionPane; /** * * @author Nipun Senarath */ public class dbconnect { public static Connection connect() { Connection sos = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); // 修正原代码中多余的闭合括号 sos = DriverManager.getConnection("jdbc:mysql://localhost:3306/restaurant","root",""); } catch (Exception e) { JOptionPane.showMessageDialog(null, e); } return sos; } public static Connection Connect() { throw new UnsupportedOperationException("Not supported yet."); } }
登录页面(PatronLogin.java)
登录成功后需获取并传递用户patron_id到主页面:
package patron.auth; import dbconnect.dbconnect; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.swing.JFrame; import javax.swing.JOptionPane; import patron.main.MainClass; public class PatronLogin extends javax.swing.JFrame { public PatronLogin() { initComponents(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { String uname = jTextField1.getText(); String pword = jPasswordField1.getText(); if (uname.isEmpty() || pword.isEmpty()) { JOptionPane.showMessageDialog(rootPane, "部分字段为空", "错误", JOptionPane.ERROR_MESSAGE); } else { try { Connection con = dbconnect.connect(); PreparedStatement pst = con.prepareStatement("select * from patron where username=? and password=?"); pst.setString(1, uname); pst.setString(2, pword); ResultSet rs = pst.executeQuery(); if (rs.next()) { // 获取当前登录用户的patron_id并传入主页面 int patronId = rs.getInt("patron_id"); MainClass pt = new MainClass(patronId); pt.setVisible(true); dispose(); } else { JOptionPane.showMessageDialog(rootPane, "用户名或密码不匹配", "登录错误", JOptionPane.ERROR_MESSAGE); } // 关闭数据库资源 rs.close(); pst.close(); con.close(); } catch (Exception ex) { ex.printStackTrace(); } } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(() -> { PatronLogin ln = new PatronLogin(); ln.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); ln.setVisible(true); }); } }
用户主页面(MainClass.java)
接收并存储patron_id,传递给下单和订单历史页面:
package patron.main; import patron.event.EventMenuSelected; import patron.form.Form_1; import patron.form.Form_4; import patron.form.Form_3; import patron.form.Form_2; import patron.form.Form_Home; import java.awt.Color; import javax.swing.JComponent; public class MainClass extends javax.swing.JFrame { private Form_Home home; private Form_1 form1; private Form_2 form2; public static Form_3 form3; private Form_4 form4; private int patronId; // 存储当前登录用户ID // 修改构造方法,接收patron_id参数 public MainClass(int patronId) { this.patronId = patronId; initComponents(); setBackground(new Color(0, 0, 0, 0)); home = new Form_Home(); form1 = new Form_1(); form2 = new Form_2(); form3 = new Form_3(patronId); // 传递用户ID到下单页面 form4 = new Form_4(patronId); // 传递用户ID到订单历史页面 menu.initMoving(MainClass.this); menu.addEventMenuSelected(new EventMenuSelected() { @Override public void selected(int index) { if (index == 0) { setForm(home); } else if (index == 1) { setForm(form1); } else if (index == 2) { setForm(form2); } else if (index == 3) { setForm(form3); } else if (index == 4) { setForm(form4); } } }); setForm(new Form_Home()); } public void setForm(JComponent com) { mainPanel.removeAll(); mainPanel.add(com); mainPanel.repaint(); mainPanel.revalidate(); } public static void main(String args[]) { // 实际场景通过登录页面创建实例,此处仅作占位 java.awt.EventQueue.invokeLater(() -> {}); } }
下单页面(Form_3.java)实现订单存储
package patron.form; import dbconnect.dbconnect; import java.sql.Connection; import java.sql.PreparedStatement; import javax.swing.JOptionPane; public class Form_3 extends javax.swing.JPanel { private int patronId; public Form_3(int patronId) { this.patronId = patronId; initComponents(); } // 下单按钮事件处理 private void btnPlaceOrderActionPerformed(java.awt.event.ActionEvent evt) { String item = txtItem.getText(); String priceStr = txtPrice.getText(); if (item.isEmpty() || priceStr.isEmpty()) { JOptionPane.showMessageDialog(this, "请填写完整菜品信息", "错误", JOptionPane.ERROR_MESSAGE); return; } try { double price = Double.parseDouble(priceStr); Connection con = dbconnect.connect(); // 插入订单数据(order_id设为数据库自增主键) String sql = "INSERT INTO orders (patron_id, item, price) VALUES (?, ?, ?)"; PreparedStatement pst = con.prepareStatement(sql); pst.setInt(1, patronId); pst.setString(2, item); pst.setDouble(3, price); int rowsAffected = pst.executeUpdate(); if (rowsAffected > 0) { JOptionPane.showMessageDialog(this, "下单成功!", "成功", JOptionPane.INFORMATION_MESSAGE); txtItem.setText(""); txtPrice.setText(""); } else { JOptionPane.showMessageDialog(this, "下单失败,请重试", "错误", JOptionPane.ERROR_MESSAGE); } pst.close(); con.close(); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, "价格必须为数字", "错误", JOptionPane.ERROR_MESSAGE); } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(this, "数据库操作失败:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } }
订单历史页面(Form_4.java)实现查询功能
package patron.form; import dbconnect.dbconnect; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import javax.swing.table.DefaultTableModel; public class Form_4 extends javax.swing.JPanel { private int patronId; private DefaultTableModel tableModel; public Form_4(int patronId) { this.patronId = patronId; initComponents(); initTable(); loadOrderHistory(); } private void initTable() { tableModel = new DefaultTableModel(); orderTable.setModel(tableModel); } // 加载当前用户的订单历史 private void loadOrderHistory() { try { Connection con = dbconnect.connect(); String sql = "SELECT order_id, item, price, order_date FROM orders WHERE patron_id = ? ORDER BY order_date DESC"; PreparedStatement pst = con.prepareStatement(sql); pst.setInt(1, patronId); ResultSet rs = pst.executeQuery(); // 设置表格表头 ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); tableModel.setColumnCount(0); for (int i = 1; i <= columnCount; i++) { tableModel.addColumn(metaData.getColumnName(i)); } // 填充订单数据 tableModel.setRowCount(0); while (rs.next()) { Object[] row = new Object[columnCount]; for (int i = 1; i <= columnCount; i++) { row[i-1] = rs.getObject(i); } tableModel.addRow(row); } rs.close(); pst.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } }
数据库表结构建议
patron用户表
CREATE TABLE patron ( patron_id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL );
orders订单表
CREATE TABLE orders ( order_id INT PRIMARY KEY AUTO_INCREMENT, patron_id INT NOT NULL, item VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (patron_id) REFERENCES patron(patron_id) );
内容的提问来源于stack exchange,提问作者Chizo
相关产品推荐
相关产品推荐

