java實(shí)現(xiàn)自動(dòng)售貨機(jī)
JAVA基礎(chǔ)練手項(xiàng)目—自動(dòng)售貨機(jī),供大家參考,具體內(nèi)容如下
要求:
簡易售貨機(jī)
流程:
【投幣】—>【顯示貨物清單】—>【選擇一個(gè)商品編號購買】—>【提示出貨】—>【找錢】
功能要求:
1. 使用mysql數(shù)據(jù)庫,將所有貨物存儲(chǔ)在數(shù)據(jù)庫中(貨物應(yīng)至少具有編號、名稱、數(shù)量、價(jià)格等基本信息,可自行增加其他屬性以完善程序)。
2. 要有友好的客戶提示,例如:請輸入購買商品的編號。
3. 清單要求包含每種商品的剩余數(shù)量。
4. 出貨后,可以選擇【找錢】,也可以選擇【繼續(xù)購買】,而不直接找錢
以下為解題思路及答案(略過數(shù)據(jù)庫建表操作):
1、首先要先將JDBC鏈接包加入路徑,這一步在之前的博客中已經(jīng)講過,這里就直接略過了。然后就是在代碼中將驅(qū)動(dòng)器打開:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtil { ? ? //定義JDBC包導(dǎo)入路徑 ? ? private String dbDriver = "com.mysql.jdbc.Driver"; ? ? //連接要操作的數(shù)據(jù)庫 ? ? private String url = "jdbc:mysql://localhost:3306/database"; ? ? //數(shù)據(jù)庫用戶名 ? ? private String user = "root"; ? ? //數(shù)據(jù)庫密碼 ? ? private String password = "123456"; ? ? /**打開JDBC驅(qū)動(dòng)器 ? ? ?* 如果打開不成功,要拋出異常 ? ? ?* @return ? ? ?* @throws Exception ? ? ?*/ ? ? public Connection getDBConn() throws Exception{ ? ? ? ? try { ? ? ? ? ? ? Class.forName(dbDriver); ? ? ? ? ? ? return DriverManager.getConnection(url, user, password); ? ? ? ? } catch (ClassNotFoundException e) { ? ? ? ? ? ? throw new ClassNotFoundException("數(shù)據(jù)庫驅(qū)動(dòng)不存在??!"); ? ? ? ? } catch (SQLException e) { ? ? ? ? ? ? throw new SQLException("數(shù)據(jù)庫連接異常!"); ? ? ? ? } ? ? } ? ? /** ? ? ?* 關(guān)閉Connection, ? ? ?* 如果關(guān)閉不成功要拋出異常 ? ? ?*/ ? ? public void close(Connection conn){ ? ? ? ? try { ? ? ? ? ? ? if(conn != null){ ? ? ? ? ? ? ? ? conn.close(); ? ? ? ? ? ? } ? ? ? ? } catch (SQLException e) { ? ? ? ? ? ? // TODO Auto-generated catch block ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } ? ? /** ? ? ?* 關(guān)閉Statement, ? ? ?* 如果關(guān)閉不成功要拋出異常 ? ? ?*/ ? ? public void close(Statement stat){ ? ? ? ? try { ? ? ? ? ? ? if(stat != null){ ? ? ? ? ? ? ? ? stat.close(); ? ? ? ? ? ? } ? ? ? ? } catch (SQLException e) { ? ? ? ? ? ? // TODO Auto-generated catch block ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } ? ? /** ? ? ?* 關(guān)閉ResultSet, ? ? ?* 如果關(guān)閉不成功要拋出異常 ? ? ?*/ ? ? public void close(ResultSet rs){ ? ? ? ? try { ? ? ? ? ? ? if(rs != null){ ? ? ? ? ? ? ? ? rs.close(); ? ? ? ? ? ? } ? ? ? ? } catch (SQLException e) { ? ? ? ? ? ? // TODO Auto-generated catch block ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } }
2、操作完JDBC之后,新建一個(gè)類,用來定義自動(dòng)售貨機(jī)具有的各個(gè)屬性及方法:
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 { ? ? //實(shí)例化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; ? ? } ? ? //顯示當(dāng)前商品的信息 ? ? public void displayAllGoods(){ ? ? ? ? //結(jié)果集封裝 ? ? ? ? ArrayList<String[]> rsList = new ArrayList<String[]>();? ? ? ? ? String[] strTemp = null; ? ? ? ? //sql顯示操作 ? ? ? ? String sql = "SELECT `Code`, `Name`, Number, Price FROM goods"; ? ? ? ? try { ? ? ? ? ? ? //驅(qū)動(dòng)器加載 ? ? ? ? ? ? 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{ ? ? ? ? ? ? //關(guān)閉連接 ? ? ? ? ? ? dbu.close(rs); ? ? ? ? ? ? dbu.close(stat); ? ? ? ? ? ? dbu.close(conn); ? ? ? ? } ? ? } ? ? //進(jìn)行購買 ? ? public void buyByCode(){ ? ? ? ? System.out.println("請輸入您想購買的商品編號:"); ? ? ? ? int code = scanner.nextInt(); ? ? ? ? //如果購買成功,則商品數(shù)量減一,該商品銷售所得金額增加自身價(jià)格 ? ? ? ? String sql = "update Goods set Number = Number - 1, Gain = Gain + Price where Code = " + code; ? ? ? ? try { ? ? ? ? ? ? //驅(qū)動(dòng)器加載 ? ? ? ? ? ? conn = dbu.getDBConn(); ? ? ? ? ? ? //手動(dòng)提交 ? ? ? ? ? ? //conn.setAutoCommit(false); ? ? ? ? ? ? stat = conn.createStatement(); ? ? ? ? ? ? //操作影響行數(shù) ? ? ? ? ? ? int affectedRows = stat.executeUpdate(sql); ? ? ? ? ? ? //檢查余額是否足夠 ? ? ? ? ? ? if(checkMoney(code, stat, this.money)){ ? ? ? ? ? ? ? ? if(affectedRows > 0){ ? ? ? ? ? ? ? ? ? ? System.out.println("購買成功!"); ? ? ? ? ? ? ? ? ? ? //操作成功則手動(dòng)提交 ? ? ? ? ? ? ? ? ? ? //conn.commit(); ? ? ? ? ? ? ? ? ? ? //后續(xù)操作:找零或繼續(xù)購買 ? ? ? ? ? ? ? ? ? ? this.proceed(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? }else{ ? ? ? ? ? ? ? ? System.out.println("金額不足!"); ? ? ? ? ? ? ? ? //回到驅(qū)動(dòng)器加載的位置 ? ? ? ? ? ? ? ? //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()){ ? ? ? ? ? ? ? ? //對余額進(jìn)行更改 ? ? ? ? ? ? ? ? SimpleVendingMachine.balance = money - rs.getDouble("Price"); ? ? ? ? ? ? ? ? if(SimpleVendingMachine.balance >= 0){ ? ? ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? }else{ ? ? ? ? ? ? ? ? ? ? return false;? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } catch (SQLException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? ? ? return false; ? ? } ? ? //定義后續(xù)操作 ? ? public void proceed(){ ? ? ? ? System.out.println("請選擇找零(0)或繼續(xù)購買(1):"); ? ? ? ? int n = scanner.nextInt(); ? ? ? ? switch(n){ ? ? ? ? ? ? case 0: ? ? ? ? ? ? ? ? System.out.println("剩余零錢:" + SimpleVendingMachine.balance + "已退回!"); ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case 1: ? ? ? ? ? ? ? ? this.money = SimpleVendingMachine.balance; ? ? ? ? ? ? ? ? buyByCode(); ? ? ? ? ? ? ? ? break; ? ? ? ? } ? ? } }
3 . 之后定義售貨機(jī)服務(wù)菜單,讓用戶進(jìn)行投幣、購買及后續(xù)操作:
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("---------------------------"); ? ? ? ? //投入金額準(zhǔn)備購買商品 ? ? ? ? System.out.println("請輸入您要投入的金額:"); ? ? ? ? svm.slot(scanner.nextDouble()); ? ? ? ? svm.buyByCode(); ? ? } }
4、最后就是在主方法中將SVMService 實(shí)例化并進(jìn)行調(diào)用:
public class Demo { ? ? public static void main(String[] args) { ? ? ? ? SVMService svms = new SVMService(); ? ? ? ? svms.service(); ? ? } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring遠(yuǎn)程調(diào)用HttpClient/RestTemplate的方法
這篇文章主要介紹了Spring遠(yuǎn)程調(diào)用HttpClient/RestTemplate的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03java Nio使用NioSocket客戶端與服務(wù)端交互實(shí)現(xiàn)方式
這篇文章主要介紹了java Nio使用 NioSocket 客戶端與服務(wù)端交互實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java 中String StringBuilder 與 StringBuffer詳解及用法實(shí)例
這篇文章主要介紹了Java 中String StringBuilder 與 StringBuffer詳解及用法實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02SpringBoot項(xiàng)目jar和war打包部署方式詳解
這篇文章主要為大家介紹了SpringBoot項(xiàng)目jar和war打包部署方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09SpringBoot四大神器之Actuator的使用小結(jié)
這篇文章主要介紹了SpringBoot四大神器之Actuator的使用小結(jié),詳細(xì)的介紹了Actuator的使用和端點(diǎn)的使用,有興趣的可以了解一下2017-11-11SpringMVC中MultipartFile轉(zhuǎn)File的兩種方式
在spring上傳文件中,一般都使用了MultipartFile來接收,但是有需要用到File的地方,本文主要介紹了SpringMVC中MultipartFile轉(zhuǎn)File的兩種方式,感興趣的可以了解一下2022-04-04