JAVA基礎—簡易自動售貨機

  • 2019 年 12 月 17 日
  • 筆記

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的使用方法 …..