JAVA基础---简易自动售货机

来源:互联网 发布:js如何设置按钮 编辑:程序博客网 时间:2024/05/01 06:51

JAVA基础练手项目—自动售货机


  • 要求:

简易售货机
流程:
【投币】—>【显示货物清单】—>【选择一个商品编号购买】—>【提示出货】—>【找钱】


功能要求:
 1. 使用mysql数据库,将所有货物存储在数据库中(货物应至少具有编号、名称、数量、价格等基本信息,可自行增加其他属性以完善程序)。
 2. 要有友好的客户提示,例如:请输入购买商品的编号。
 3. 清单要求包含每种商品的剩余数量。
 4. 出货后,可以选择【找钱】,也可以选择【继续购买】,而不直接找钱

以下为解题思路及答案(略过数据库建表操作):

  1. 首先要先将JDBC链接包加入路径,这一步在之前的博客中已经讲过,这里就直接略过了。然后就是在代码中将驱动器打开:
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class DBUtil {    //定义JDBC包导入路径    private String dbDriver = "com.mysql.jdbc.Driver";    //连接要操作的数据库    private String url = "jdbc:mysql://localhost:3306/database";    //数据库用户名    private String user = "root";    //数据库密码    private String password = "123456";    /**打开JDBC驱动器     * 如果打开不成功,要抛出异常     * @return     * @throws Exception     */    public Connection getDBConn() throws Exception{        try {            Class.forName(dbDriver);            return DriverManager.getConnection(url, user, password);        } catch (ClassNotFoundException e) {            throw new ClassNotFoundException("数据库驱动不存在!!");        } catch (SQLException e) {            throw new SQLException("数据库连接异常!");        }    }    /**     * 关闭Connection,     * 如果关闭不成功要抛出异常     */    public void close(Connection conn){        try {            if(conn != null){                conn.close();            }        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    /**     * 关闭Statement,     * 如果关闭不成功要抛出异常     */    public void close(Statement stat){        try {            if(stat != null){                stat.close();            }        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    /**     * 关闭ResultSet,     * 如果关闭不成功要抛出异常     */    public void close(ResultSet rs){        try {            if(rs != null){                rs.close();            }        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}


2 . 操作完JDBC之后,新建一个类,用来定义自动售货机具有的各个属性及方法:

import java.sql.Connection;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.Scanner;public class SimpleVendingMachine {    //实例化JDBC连接和输入方法    DBUtil dbu = new DBUtil();    Scanner scanner = new Scanner(System.in);    //定义Connection,Statement和ResultSet    Connection conn = null;    Statement stat = null;    ResultSet rs = null;    //定义投入的金币和余额    private double money;    private static double balance = 0;      //投入金钱    public void slot(double money){        this.money = money;    }    //显示当前商品的信息    public void displayAllGoods(){        //结果集封装        ArrayList<String[]> rsList = new ArrayList<String[]>();         String[] strTemp = null;        //sql显示操作        String sql = "SELECT `Code`, `Name`, Number, Price FROM goods";        try {            //驱动器加载            conn = dbu.getDBConn();            stat = conn.createStatement();            rs = stat.executeQuery(sql);            ResultSetMetaData rsmd = rs.getMetaData();            int columnCount = rsmd.getColumnCount();            String[] columnNames = new String[columnCount];            for(int i = 0 ; i < columnNames.length ; i++){                columnNames[i] = rsmd.getColumnName(i + 1);            }            rsList.add(columnNames);            //遍历赋值            while(rs.next()){                strTemp = new String[columnCount];                for(int i = 0 ; i < columnNames.length ; i ++){                    strTemp[i] = rs.getString(columnNames[i]);                }                rsList.add(strTemp);                }            //遍历输出            for(String[] datas : rsList){                for(String data : datas){                    System.out.print(data + "\t");                }                System.out.println();            }        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            //关闭连接            dbu.close(rs);            dbu.close(stat);            dbu.close(conn);        }    }    //进行购买    public void buyByCode(){        System.out.println("请输入您想购买的商品编号:");        int code = scanner.nextInt();        //如果购买成功,则商品数量减一,该商品销售所得金额增加自身价格        String sql = "update Goods set Number = Number - 1, Gain = Gain + Price where Code = " + code;        try {            //驱动器加载            conn = dbu.getDBConn();            //手动提交            //conn.setAutoCommit(false);            stat = conn.createStatement();            //操作影响行数            int affectedRows = stat.executeUpdate(sql);            //检查余额是否足够            if(checkMoney(code, stat, this.money)){                if(affectedRows > 0){                    System.out.println("购买成功!");                    //操作成功则手动提交                    //conn.commit();                    //后续操作:找零或继续购买                    this.proceed();                }            }else{                System.out.println("金额不足!");                //回到驱动器加载的位置                //conn.rollback();            }        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            dbu.close(rs);            dbu.close(stat);            dbu.close(conn);        }    }    //检查投入金额是否足够购买商品    public boolean checkMoney(int code, Statement stat, double money){        ResultSet rs = null;        try {            rs = stat.executeQuery("select Price from goods where Code  = " + code);            while(rs.next()){                //对余额进行更改                SimpleVendingMachine.balance = money - rs.getDouble("Price");                if(SimpleVendingMachine.balance >= 0){                    return true;                }else{                    return false;                 }            }        } catch (SQLException e) {            e.printStackTrace();        }        return false;    }    //定义后续操作    public void proceed(){        System.out.println("请选择找零(0)或继续购买(1):");        int n = scanner.nextInt();        switch(n){            case 0:                System.out.println("剩余零钱:" + SimpleVendingMachine.balance + "已退回!");                break;            case 1:                this.money = SimpleVendingMachine.balance;                buyByCode();                break;        }    }}



3 . 之后定义售货机服务菜单,让用户进行投币、购买及后续操作:

import java.util.Scanner;public class SVMService {    SimpleVendingMachine svm = new SimpleVendingMachine();    Scanner scanner = new Scanner(System.in);    public void service(){        //显示所有商品        svm.displayAllGoods();        System.out.println("---------------------------");        //投入金额准备购买商品        System.out.println("请输入您要投入的金额:");        svm.slot(scanner.nextDouble());        svm.buyByCode();    }}



4 . 最后就是在主方法中将SVMService 实例化并进行调用:

public class Demo {    public static void main(String[] args) {        SVMService svms = new SVMService();        svms.service();    }}





- 最后的最后,求大佬讲解markdown和GitHub的使用方法 …..

原创粉丝点击