java实现自动售货机

 更新时间:2022年01月23日 15:38:34   作者:吾人为学  
这篇文章主要为大家详细介绍了java实现自动售货机,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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();
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • springboot 自定义属性与加载@value示例详解

    springboot 自定义属性与加载@value示例详解

    在SpringBoot框架中,自定义属性通常通过application.properties文件配置,并使用@Value注解加载,虽然这是一种可行的方法,但存在一种更优雅的实现方式,本文给大家介绍springboot 自定义属性与加载@value的相关操作,感兴趣的朋友一起看看吧
    2024-10-10
  • Spring装配Bean教程之XML安装配置bean详解

    Spring装配Bean教程之XML安装配置bean详解

    大家都知道spring有多重配置方式,基于XML,基于注解,基于java类的配置,其中基于XML是最强大的一种,下面这篇文章主要给大家介绍了关于Spring装配Bean之XML安装配置bean的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • Java中zip的压缩和解压缩的实现代码

    Java中zip的压缩和解压缩的实现代码

    这篇文章主要介绍了Java中zip的压缩和解压缩的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Spring配置动态数据源实现读写分离的方法

    Spring配置动态数据源实现读写分离的方法

    这篇文章主要介绍了利用Spring配置动态数据源实现读写分离的方法,文中通过示例代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,藕需要的朋友可以一起学习学习。
    2017-01-01
  • Java使用Redis实现秒杀功能

    Java使用Redis实现秒杀功能

    这篇文章主要为大家详细介绍了Java使用Redis实现秒杀功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Java设计模式的策略模式简析

    Java设计模式的策略模式简析

    这篇文章主要介绍了Java设计模式的策略模式简析,策略模式中定义了一系列的算法族,算法族指的是类似于一系列的行为、策略,策略模式将一系列的行为封装成类,既可以说是将每一种相类似的行为都封装成一个类,也有可能存在特殊的不进行封装的行为,需要的朋友可以参考下
    2023-12-12
  • java把excel内容上传到mysql实例代码

    java把excel内容上传到mysql实例代码

    这篇文章主要介绍了java把excel内容上传到mysql实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 单例模式垃圾回收_动力节点Java学院整理

    单例模式垃圾回收_动力节点Java学院整理

    这篇文章主要为大家详细介绍了单例模式垃圾回收的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Spring Boot整合 NoSQL 数据库 Redis详解

    Spring Boot整合 NoSQL 数据库 Redis详解

    这篇文章主要为大家介绍了Spring Boot整合 NoSQL 数据库 Redis详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Spring @Transactional注解的声明式事务简化业务逻辑中的事务管理

    Spring @Transactional注解的声明式事务简化业务逻辑中的事务管理

    这篇文章主要为大家介绍了Spring @Transactional注解的声明式事务简化业务逻辑中的事务管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论