点菜系统--总结

在学校做了一个小型的点菜系统,现在终于可以做一下总结。

总结一:对于多用户的系统,面向对象的编程思想是很重要的。可以将一种用户封装成一个类。

总结二:在编写程序时注意使用包,这样可以使代码在编写的时候更方便。


总结三:在调试程序时可以使用弹出对话框的形式显示自己需要看到的一些参数。

JOptionPane.showMessageDialog(getContentPane(), "请选择欲配送的消费项", "友情提示", JOptionPane.INFORMATION_MESSAGE);
        			

接下来附上一些基本的类

package com.resturant.base;
//提供数据库的连接与释放服务

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBC {
	//数据库连接的相关参数
	private static final String DRIVERCLASS = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	private static final String URL = "jdbc:sqlserver://127.0.0.1:1368;databaseName=Restaurant";
	private static final String USERNAME = "sheepc";
	private static final String PASSWORD = "10425250c";
	
	private static final ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
	
    static {// 通过静态方法加载数据库驱动
        try {
            Class.forName(DRIVERCLASS).newInstance();// 加载数据库驱动
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static Connection getConnection() {// 创建数据库连接的方法
        Connection conn = threadLocal.get();// 从线程中获得数据库连接
        if (conn == null) {// 没有可用的数据库连接
            try {
                conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);// 创建新的数据库连接
                threadLocal.set(conn);// 将数据库连接保存到线程中
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return conn;
    }
    
    public static boolean closeConnection() {// 关闭数据库连接的方法
        boolean isClosed = true;
        Connection conn = threadLocal.get();// 从线程中获得数据库连接
        threadLocal.set(null);// 清空线程中的数据库连接
        if (conn != null) {// 数据库连接可用
            try {
                conn.close();// 关闭数据库连接
            } catch (SQLException e) {
                isClosed = false;
                e.printStackTrace();
            }
        }
        return isClosed;
    }
}


//各种操作的集合
package com.resturant.base;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

public class Operation{
    private static Operation op;
    
    static {
        op = new Operation();
    }
    
    public static Operation getInstance() {
        return op;
    }
    
        // 查询多个记录,返回一个列表(不包含属性名,只含数据)
    public Vector<Vector<Object>> selectSomeNote(String sql) {
        Vector<Vector<Object>> vector = new Vector<Vector<Object>>();// 创建结果集向量
        Connection conn = JDBC.getConnection();// 获得数据库连接
        try {
            Statement stmt = conn.createStatement();// 创建连接状态对象
            ResultSet rs = stmt.executeQuery(sql);// 执行SQL语句获得查询结果
            int columnCount = rs.getMetaData().getColumnCount();// 获得查询数据表的列数
            int row = 1;// 定义行序号
            
            if(columnCount == 0)
            {
            	vector = null;
            	return vector;
            }
            while (rs.next()) {// 遍历结果集
                Vector<Object> rowV = new Vector<Object>();// 创建行向量
                rowV.add(new Integer(row++));// 添加行序号
                for (int column = 1; column <= columnCount; column++) {
                    rowV.add(rs.getObject(column));// 添加列值
                }
                vector.add(rowV);// 将行向量添加到结果集向量中
            }
            rs.close();// 关闭结果集对象
            stmt.close();// 关闭连接状态对象
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return vector;// 返回结果集向量
    }
    
    // 查询单个记录
    public Vector<Object> selectOnlyNote(String sql) {
        Vector<Object> vector = null;
        Connection conn = JDBC.getConnection();
        try {
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            int columnCount = rs.getMetaData().getColumnCount();
            if(columnCount == 0)
            {
            	return vector;
            }
            while (rs.next()) {
                vector = new Vector<Object>();
                for (int column = 1; column <= columnCount; column++) {
                    vector.add(rs.getObject(column));
                }
            }
            
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return vector;
    }
    
    // 查询多个值
    public Vector<Object> selectSomeValue(String sql) {
        Vector<Object> vector = new Vector<Object>();
        Connection conn = JDBC.getConnection();
        try {
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            int columnCount = rs.getMetaData().getColumnCount();
            if(columnCount == 0)
            {
            	return vector;
            }
            while (rs.next()) {
                vector.add(rs.getObject(1));
            }
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return vector;
    }
    
    // 查询单个值
    public Object selectOnlyValue(String sql) {
        Object value = null;
        Connection conn = JDBC.getConnection();
        try {
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            int columnCount = rs.getMetaData().getColumnCount();
            if(columnCount == 0)
            {
            	return value;
            }
            while (rs.next()) {
                value = rs.getObject(1);
            }
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return value;
    }
    
    // 插入、修改、删除记录
    public boolean longHaul(String sql) {
        boolean isLongHaul = true;// 默认持久化成功
        Connection conn = JDBC.getConnection();// 获得数据库连接
        try {
            conn.setAutoCommit(false);// 设置为手动提交
            Statement stmt = conn.createStatement();// 创建连接状态对象
            stmt.executeUpdate(sql);// 执行SQL语句
            stmt.close();// 关闭连接状态对象
            conn.commit();// 提交持久化
        } catch (SQLException e) {
            isLongHaul = false;// 持久化失败
            try {
                conn.rollback();// 回滚
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }
        return isLongHaul;// 返回持久化结果
    }
}


package com.resturant.mwing;

import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;

public class MTable extends JTable {
    
    /**
     * 
     */
    private static final long serialVersionUID = 7739039874491753652L;
    
    public MTable() {
        super();
    }
    
    public MTable(DefaultTableModel tableModel) {
        super(tableModel);
    }
    
    // 表格列值居中显示
    @Override
    public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
        // 获得除表格头部分的单元格对象
        DefaultTableCellRenderer tableRenderer = (DefaultTableCellRenderer) super.getDefaultRenderer(columnClass);
        // 设置单元格内容居中显示
        tableRenderer.setHorizontalAlignment(SwingConstants.CENTER);
        return tableRenderer;
    }
    
    // 表格列名信息
    @Override
    public JTableHeader getTableHeader() {
        // 获得表格头对象
        JTableHeader tableHeader = super.getTableHeader();
        tableHeader.setReorderingAllowed(false);// 设置表格列不可重排
        // 获得表格头的单元格对象
        DefaultTableCellRenderer headerRenderer = (DefaultTableCellRenderer) tableHeader.getDefaultRenderer();
        // 设置单元格内容(即列名)居中显示
        headerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
        return tableHeader;
    }
    
    // 表格不可编辑
    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }
    
    // 用来设置表格的选中行
    @Override
    public void setRowSelectionInterval(int fromRow, int toRow) {// 重构父类的方法
        super.setRowSelectionInterval(fromRow, toRow);
    }
    
    // 用来设置表格的唯一选中行
    public void setRowSelectionInterval(int row) {// 通过重载实现自己的方法
        setRowSelectionInterval(row, row);
    }
    
    // 表格行只可单选
    @Override
    public ListSelectionModel getSelectionModel() {
        ListSelectionModel selectionModel = super.getSelectionModel();
        selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        return selectionModel;
    }
    
}


package com.resturant.mwing;

import java.awt.Insets;

import javax.swing.JButton;

public class MButton extends JButton {
    /**
     * 
     */
    private static final long serialVersionUID = 5677833057913201022L;
    
    public MButton() {
        setContentAreaFilled(false);
        setMargin(new Insets(0, 0, 0, 0));
        setBorderPainted(false);
        setFocusPainted(false);
    }
}


package com.resturant.mwing;

import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class MPanel extends JPanel {
    
    /**
     带图片的面板 
     */
    private static final long serialVersionUID = 7056298952360607443L;
    private ImageIcon imageIcon;// 声明一个图片对象
    
    public MPanel(URL imgUrl) {
        super();// 继承父类的构造方法
        setLayout(new GridBagLayout());// 将布局管理器修改为网格组布局
        imageIcon = new ImageIcon(imgUrl);// 根据传入的URL创建ImageIcon对象
        setSize(imageIcon.getIconWidth(), imageIcon.getIconHeight());// 设置面板与图片等大
    }
    
    @Override
    protected void paintComponent(Graphics g) {// 重写JPanel类的paintComponent()方法
        super.paintComponent(g);// 调用JPanel类的paintComponent()方法
        Image image = imageIcon.getImage();// 通过ImageIcon对象获得Image对象
        g.drawImage(image, 0, 0, null);// 绘制Image对象,即将图片绘制到面板中
    }
    
}


对于表格的使用样例,先声明列名向量,再设置表格模式,最后设置表格。

	private JTable menuTable;
	private final Vector menuColumnNameV = new Vector();
	private final DefaultTableModel menuModel = new DefaultTableModel();

        String columnNames[] = new String[] {"序号", "编号", "菜名", "菜系", "菜类", "单价", "单位"};
        for (int i = 0; i < columnNames.length; i++) {
        	menuColumnNameV.add(columnNames[i]);
        }
        
        menuModel.setDataVector(op.selectSomeNote("SELECT [MENU].id,[MENU].name,[CUISINE].name,[DISH_CATEGORY].name,price,unit FROM MENU,CUISINE,DISH_CATEGORY WHERE [MENU].cuisine_id = [CUISINE].id AND [MENU].category_id = [DISH_CATEGORY].id"), menuColumnNameV);
        
        menuTable = new MTable(menuModel);
        if (menuTable.getRowCount() > 0)
        	menuTable.setRowSelectionInterval(0, 0);
        menuScrollPane.setViewportView(menuTable);


  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值