JAVA基礎—簡易自動售貨機
- 2019 年 12 月 17 日
- 筆記
JAVA基礎練手項目—自動售貨機
- 要求:
簡易售貨機 流程: 【投幣】—>【顯示貨物清單】—>【選擇一個商品編號購買】—>【提示出貨】—>【找錢】 功能要求: 1. 使用mysql資料庫,將所有貨物存儲在資料庫中(貨物應至少具有編號、名稱、數量、價格等基本資訊,可自行增加其他屬性以完善程式)。 2. 要有友好的客戶提示,例如:請輸入購買商品的編號。 3. 清單要求包含每種商品的剩餘數量。 4. 出貨後,可以選擇【找錢】,也可以選擇【繼續購買】,而不直接找錢
以下為解題思路及答案(略過資料庫建表操作):
- 首先要先將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的使用方法 …..