本篇文章给大家分享的是有关java如何实现自动售货机,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
要求:
简易售货机
流程:
【投币】—>【显示货物清单】—>【选择一个商品编号购买】—>【提示出货】—>【找钱】
功能要求:
使用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"; 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("数据库连接异常!"); } } public void close(Connection conn){ try { if(conn != null){ conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void close(Statement stat){ try { if(stat != null){ stat.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void close(ResultSet rs){ try { if(rs != null){ rs.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
操作完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(); }}
最后就是在主方法中将SVMService 实例化并进行调用:
public class Demo { public static void main(String[] args) { SVMService svms = new SVMService(); svms.service(); }}
Java的优点是什么
1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是面向网络的语言;4. 鲁棒性,java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。;5. 安全性,用于网络、分布环境下的Java必须防止病毒的入侵。6. 体系结构中立,只要安装了Java运行时系统,就可在任意处理器上运行。7. 可移植性,Java可以方便地移植到网络上的不同机器。8.解释执行,Java解释器直接对Java字节码进行解释执行。
以上就是java如何实现自动售货机,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。