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之后,新建一个类,用来定义自动售货机具有的各个属性及方法:
代码语言:javascript复制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 . 之后定义售货机服务菜单,让用户进行投币、购买及后续操作:
代码语言:javascript复制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 实例化并进行调用:
代码语言:javascript复制public class Demo {
public static void main(String[] args) {
SVMService svms = new SVMService();
svms.service();
}
}
- 最后的最后,求大佬讲解markdown和GitHub的使用方法 …..