You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:35:51