java项目超市购物管理系统

简介: java项目超市购物管理系统

一.概述

2.收到很多朋友私信给我,也很感谢老铁们的反馈和交流,前面这个项目只是对java基础知识和面向对象的思想练习,但是没有涉及到java如何操作数据库,如何通过java将数据从数据库拿出来,如果存进去这些问题。对于java新手来说,这些问题不知道从何处下手。有很多刚入门的java新手建议我写个java操作数据库的实战项目供入门者参考,希望帮助他们少花点时间出坑,整理一下思路,今天就抽时间写个超市购物管理系统.....go go go

3.超市购物管理系统涉及到的知识:java基础语法,java面向对象的开发思想,java如何操作数据库,集合方面的知识

4.适合java入门,不知道java如何操作数据库

5.基本所有的代码三哥会打上注释,方便阅读

6.因为是java操作数据库的实战项目,不会详细讲解java环境搭建,数据库安装,sql语法这些知识。太多了,我写一周不见得写完.....或者可以去三哥站 查看相关文章。所以开始之前你总的把java开发环境安装好吧、数据库安装好吧、

7.开发工具eclipse;jdk是1.8;数据库用的是mysql5.5 (当然sqlserver数据库完全可以)

8.源码获取:我会将核心代码粘贴出来,所有的代码关注公众号  程序三两行  实战项目中会给出

二:效果演示

=================欢迎使用超市购物管理系统=================
1.商品入库
2.根据商品编号查询商品
3.商品列表
4.购买商品
5.删除商品
6.更新商品
0.退出系统
请输入要执行的操作
 
3
编号  名称  单价  数量  
1234  苹果  12.0  35  
1235  衣服  123.0 0 
1236  篮球  200.0 20  
输入y继续/否则退出
y
1.商品入库
2.根据商品编号查询商品
3.商品列表
4.购买商品
5.删除商品
0.退出系统
请输入要执行的操作
4
输入购买商品的编号
1235
输入购买商品的数量
1
此商品库存0  无法购买;
输入y继续购买/输入其他结算
y
输入购买商品的编号
1234
输入购买商品的数量
2
购买成功
输入y继续购买/输入其他结算
1236
编号  名称  数量  总价
1234  苹果  2 24.0
总计消费:24.0元
输入y继续/否则退出
y
1.商品入库
2.根据商品编号查询商品
3.商品列表
4.购买商品
5.删除商品
0.退出系统
请输入要执行的操作
5
输入要刪除的商品编号
4564
沒有此商品
输入y继续/否则退出
y
1.商品入库
2.根据商品编号查询商品
3.商品列表
4.购买商品
5.删除商品
0.退出系统
请输入要执行的操作
3
编号  名称  单价  数量  
1234  苹果  12.0  33  
1235  衣服  123.0 0 
1236  篮球  200.0 20  
输入y继续/否则退出
y
1.商品入库
2.根据商品编号查询商品
3.商品列表
4.购买商品
5.删除商品
0.退出系统
请输入要执行的操作
4
输入购买商品的编号
1234
输入购买商品的数量
2
购买成功
输入y继续购买/输入其他结算
y
输入购买商品的编号
1234
输入购买商品的数量
2
购买成功
输入y继续购买/输入其他结算
t
编号  名称  数量  总价
1234  苹果  4 48.0
总计消费:48.0元
输入y继续/否则退出

三:创建项目

在eclipse创建一个ShopManager项目

接着我们将数据库驱动jar包引入(可以去官网下载或者在我的公众号 程序三两行  回复  jdbc  即可获取,);java和这个数据库驱动有什么关系呢?简单理解就是这个数据库驱动是java和数据库中间的桥梁,用于两者通信。

创建lib的文件夹

将我们准备好的驱动复制到这个lib中

在这个驱动上右键执行

最后完整的结构

创建项目结构,很重要,很重要,很重要,这些都是开发要注意的,对于这些小项目而言,完全可以将所有的代码类都放在src下,但是以后项目越来越大,所有的类成千上百个,都放在src,没有分包的的话,项目项目其他开发者看到代码什么承受多少点伤害。

这个系统中比较简单,下面四个包就可以,其中app包用于放系统主入口类,pojo放系统涉及的实体类,service放系统业务,utils放系统中的工具类;test临时测试类

四:连接数据库

因为系统会涉及到多次对数据库中数据的访问,所以我们将连接数据库操作写成一个工具类DbUtil,不要每次涉及到操作数据库就写重复的连接代码。

package com.javayihao.top.utils;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
/**
 * @date 2019-12-9
 * @Description 连接数据库工具类
 * @author com.javayihao.top
 */
public class DbUtil {
  //把几个用于连接数据库的字符串定义成常量,不必每次去创建
  private static final String USER = "root";//数据库用户名
  private static final String UPWD = "root";//数据库密码
  //本地数据库shop
  private static final String URL = "jdbc:mysql://localhost:3306/shop";
  //驱动
  private static final String DRIVER = "com.mysql.jdbc.Driver";
  //注册驱动
  static {
    try {
      Class.forName(DRIVER);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
 
  //得到数据库连接对象Connection的函数
  public static Connection getConnection() throws SQLException {
    return DriverManager.getConnection(URL, USER, UPWD);
  }
 
  //关闭连接和 执行 的打开资源
  public static void close(Connection connection, Statement statement) {
    if (statement != null) {
      try {
        statement.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (connection != null) {
      try {
        connection.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
 
  //关闭所有的打开资源
  public static void close(Connection connection, Statement statement, ResultSet rs) {
    if (statement != null) {
      try {
        statement.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (connection != null) {
      try {
        connection.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
 
}

测试

package com.javayihao.top.test;
 
import java.sql.Connection;
import java.sql.SQLException;
 
import com.javayihao.top.utils.DbUtil;
 
/**
 * @date 2019-12-9
 * @Description 测试数据库连接类
 * @author com.javayihao.top
 */
public class DbUtilTest {
  public static void main(String[] args) throws SQLException {
    Connection con = DbUtil.getConnection();
    System.out.println(con);
  }
}

如下,说明数据库连接成功

五:创建实体类

package com.javayihao.top.pojo;
/**
 * @date 2019-12-9
 * @Description 商品实体
 * @author com.javayihao.top
 */
public class Good {
  //商品编号
  private int id;
  //商品名称
  private String name;
  //商品价格(价格可能涉及到小数,这里使用float,当然真正大型购物平台不会使用float,有兴趣的朋友可以上网了解)
  private float price;
  //库存
  private int num;
  //空参构造
  public Good() {
    super();
  }
  //打印方法
  @Override
  public String toString() {
    return "Good [id=" + id + ", name=" + name + ", price=" + price + ", num=" + num + "]";
  }
  //有参构造,方便初始化对象
  public Good(int id, String name, float price, int num) {
    super();
    this.id = id;
    this.name = name;
    this.price = price;
    this.num = num;
  }
  //set get方法
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public float getPrice() {
    return price;
  }
  public void setPrice(float price) {
    this.price = price;
  }
  public int getNum() {
    return num;
  }
  public void setNum(int num) {
    this.num = num;
  }
}

六:数据库

本地创建数据库shop,创建表t_good

CREATE TABLE `t_good` (
  `id` int(5) NOT NULL,
  `name` varchar(25) NOT NULL,
  `price` float(10,2) NOT NULL,
  `num` int(5) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

七.核心业务

package com.javayihao.top.service;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Scanner;
 
import com.javayihao.top.pojo.Good;
import com.javayihao.top.utils.DbUtil;
 
/**
 * @date 2019-12-9
 * @Description 系统主界面
 * @author com.javayihao.top
 */
public class ShopView {
  //获取键盘输入对象
  Scanner input = new Scanner(System.in);
  /*
   * 系统运行方法
   */
  public void ShopStart() {
    System.out.println("=================欢迎使用超市购物管理系统=================");
    //是否继续的标志量,默认是
    String isGo="y";
    do{
      //调用菜单那展示的函数
        showMenu();
        System.out.println("请输入要执行的操作");
        //接受键盘的输入,这里使用String,一次性处理数字和字符输入,不建议使用int类型数字
        String select =input.next();
        //根据输入的选择执行对应的方法
        switch (select) {
        //执行商品入库方法
        case "1":
          insertGood();
          break;
        //执行商品查詢方法
        case "2":
          System.out.println("输入要查询的商品编号");
          int goodId = input.nextInt();
          //调用查询商品的方法,
          Good good = searchGoodById(goodId);
          //存在
          if(good!=null){
            System.out.println("商品编号:"+goodId+" 商品名称:"+good.getName()
            +"  商品价格:"+good.getPrice()+"  商品数量:"+good.getNum());
          }else{
            System.out.println("此商品不存在");
          }
          break;
        //执行商品列表方法
        case "3":
          getGoodList();
          break;
        //执行商品购买方法
        case "4":
          buyGood();
          break;
          //执行商品购买方法
        case "5":
          System.out.println("输入要刪除的商品编号");
          int id = input.nextInt();
          //调用查询商品的方法,
          if(searchGoodById(id)!=null){
            deleteGood(id);
          }else{
            System.out.println("沒有此商品");
          }
          break;
        case "6":
          updateGood();
          break;
        //退出系统
        case "0":
          System.out.println("*************欢迎下次使用 再见!*************");
          //终止程序
          System.exit(0);
        default:
          System.err.println("输入有误 请重新输入!");
          continue;
      }
        System.out.println("输入y继续/否则退出");
        isGo = input.next();
    }while(isGo.equals("y"));
    System.out.println("*************欢迎下次使用 再见!*************");
  }
  /**
   * 更新商品操作
   * 1.先查询当前要更新的商品存不存在
   * 2.如果存在更新即可,不存在提示
   */
  private void updateGood() {
    System.out.println("输入要修改的商品id");
    int gid = input.nextInt();
    Good good = searchGoodById(gid);
    System.out.println("商品信息如下");
    if(good!=null){
      System.out.println("商品编号:"+gid+" 商品名称:"+good.getName()
      +"  商品价格:"+good.getPrice()+"  商品数量:"+good.getNum());
      System.out.println("修改商品名称");
      String name = input.next();
      System.out.println("修改商品单价");
      float price = input.nextFloat();
      System.out.println("修改商品库存");
      int num = input.nextInt();
      String sql="update t_good set name=?,price=?,num=? where id=? ";
      try {
        //创建一个操作数据库的对象
        Connection con = DbUtil.getConnection();
        //创建执行sql的执行对象PreparedStatement
        PreparedStatement pst = con.prepareStatement(sql);
        //给占位符设置值
        pst.setString(1, name);
        pst.setFloat(2, price);
        pst.setInt(3, num);
        pst.setInt(4, gid);
        //如果是查询的话execute()返回true,如果是更新或插入的话就返回false
        if(!pst.execute()){
          System.out.println("更新成功");
        }
        //关闭连接
        DbUtil.close(con, pst);
      } catch (Exception e) {
        e.printStackTrace();
        System.out.println("更新异常"+e.getMessage());
      }
    }else{
      System.out.println("此商品不存在");
    }
    
  }
    //用于展示系统界面菜单的方法
    private void  showMenu() {
      System.out.println("1.商品入库");
      System.out.println("2.根据商品编号查询商品");
      System.out.println("3.商品列表");
      System.out.println("4.购买商品");
      System.out.println("5.删除商品");
      System.out.println("6.更新商品");
      System.out.println("0.退出系统");
    }
  /*
   * 刪除商品
   * 1.首先得判断该商品存在
   * 2.根据商品编号id删除
   */
  private void deleteGood(int id) {
    String sql = "delete from t_good where id=?";
    try {
      //创建一个操作数据库的对象
      Connection con = DbUtil.getConnection();
      //创建执行sql的执行对象PreparedStatement
      PreparedStatement pst = con.prepareStatement(sql);
      //给占位符设置值
      pst.setInt(1, id);
      //如果是查询的话execute()返回true,如果是更新或插入的话就返回false
      if(!pst.execute()){
        System.out.println("刪除成功");
      }
      //关闭连接
      DbUtil.close(con, pst);
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("删除异常"+e.getMessage());
    }
  }
  /*
   * 商品入库
   * 这里只处理编号不能重复的逻辑,
   * 关于输入的编号是不是数字这里就不做判断,有兴趣的朋友可以试试
   */
  private void insertGood(){
    //商品编号
    int id=0;
    System.out.println("输入商品编号");
    while(true){
       id= input.nextInt();
      //判断当前输入的编号重复没有,重复重新输入
      if(searchGoodById(id)==null){
        break;
      }
      System.err.println("编号重复,请重新输入商品编号");
    }
    System.out.println("输入商品名称");
    String name = input.next();
    System.out.println("输入商品单价");
    float price = input.nextFloat();
    System.out.println("输入商品数量");
    int num = input.nextInt();
    //要执行的sql语句,这里使用占位符防止sql入侵
    String sql = "insert into t_good()values(?,?,?,?)";
    try {
      //创建一个操作数据库的对象
      Connection con = DbUtil.getConnection();
      //创建执行sql的执行对象PreparedStatement
      PreparedStatement pst = con.prepareStatement(sql);
      //给占位符设置值
      pst.setInt(1, id);
      pst.setString(2, name);
      pst.setFloat(3, price);
      pst.setInt(4, num);
      //执行sql语句
        if(!pst.execute()){
          System.out.println("入库成功");
         }
      //关闭连接
      DbUtil.close(con, pst);
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("入库异常"+e.getMessage());
    }
  }
  /*商品查询
   * 返回的是一个商品对象,没有此商品返回null
   */
  private Good searchGoodById(int id) {
    //执行的sql语句
    String sql="select id,name,price,num from t_good where id=?";
    try {
      //创建一个操作数据库的对象
      Connection con = DbUtil.getConnection();
      //创建执行sql的对象PreparedStatement
      PreparedStatement pst = con.prepareStatement(sql);
      pst.setInt(1, id);
      ResultSet rs = pst.executeQuery();
      if(rs.next()){//有结果,将查到的数据通过构造函数封装成一个商品对象
        Good good = new Good(rs.getInt("id"), rs.getString("name"), 
            rs.getFloat("price"), rs.getInt("num"));
        return good;
      }
      //关闭连接
      DbUtil.close(con, pst);
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return null;
  }
  //商品列表
  private void getGoodList(){
    //执行的sql语句
        String sql="select id,name,price,num from t_good";
        try {
          //创建一个操作数据库的对象
          Connection con = DbUtil.getConnection();
          //创建执行sql的对象PreparedStatement
          PreparedStatement pst = con.prepareStatement(sql);
          ResultSet rs = pst.executeQuery();
          System.out.println("编号\t"+"名称\t"+"单价\t"+"数量\t");
          if(rs.wasNull()){
            System.out.println("没有商品");
          }else{
            while(rs.next()){//有结果,打印
              //通过rs.getxxx("yy")方法参数是数据库列名
              System.out.println(rs.getInt("id")+"\t"+rs.getString("name")+"\t"+
                  rs.getFloat("price")+"\t"+rs.getInt("num")+"\t");
            }
          }
          //关闭连接
          DbUtil.close(con, pst);
        } catch (SQLException e) {
          e.printStackTrace();
        }
  }
  //购买商品
  public void buyGood() {
    //用来存储购买商品的集合
    ArrayList<Good> goods = new ArrayList<>();
    //是否继续购买标记
    String flag = "y";
    do{
      System.out.println("输入购买商品的编号");
      int id = input.nextInt();
      Good good = searchGoodById(id);
      if(good!=null){
        System.out.println("输入购买商品的数量");
        int num = input.nextInt();
        if(good.getNum()<num){
          System.out.println("此商品库存"+good.getNum()+"  无法购买;");
          
        }else{
          try{
            String sql="update t_good set num=? where id=?";
            //创建一个操作数据库的对象
            Connection con = DbUtil.getConnection();
            //创建执行sql的对象PreparedStatement
            PreparedStatement pst = con.prepareStatement(sql);
            pst.setInt(1, good.getNum()-num);//更新库存
            pst.setInt(2, id);
            if(pst.executeUpdate()==1){
              //存入购买商品的集合goods
              Good g = new Good(id,good.getName(),good.getPrice(),num);
              if(goods.size()>0){
                for (int i = 0; i < goods.size(); i++) {
                  if(goods.get(i).getId()==id){//如果购物车中有该商品 数量加即可
                    goods.get(0).setNum(num+goods.get(0).getNum());
                  }else{//如果购物车中没有该商品 数量加即可
                    goods.add(g);
                  }
                }
              }else{//购物车中没有商品,加入到购物车中
                goods.add(g);
              }
              System.out.println("购买成功");
            }else{
              System.out.println("购买失敗");
            }
          }catch(Exception e){
            e.printStackTrace();
            System.out.println("购买异常"+e.getMessage());
          }
        }
        System.out.println("输入y继续购买/输入其他结算");
        flag = input.next();
        if(!flag.equals("y")){
          //结算
          account(goods);
        }
      }else{
        System.out.println("没有此商品");
      }
    }while(flag.equals("y"));
  }
  //结算购物车
  private void account(ArrayList<Good> goods) {
    System.out.println("编号\t"+"名称\t"+"数量\t"+"总价");
    //lambda表达式遍历集合,当然是用for循环也ok
    goods.forEach(in->System.out.println(in.getId()+"\t"+in.getName()+
        "\t"+in.getNum()+"\t"+in.getNum()*in.getPrice()));
    //合计
    float sum=0;
    for (int i = 0; i < goods.size(); i++) {
      //对总价求和
      sum += (goods.get(i).getNum())*(goods.get(i).getPrice());
    }
    System.out.println("总计消费:"+sum+"元");
  }
}

总结

至此,项目已经完成了,当然项目本身还是存在不足,比如,在接受键盘输入的合法性判断。对于java操作数据库而言可以参考,

源码我放在了公众号  程序三两行  有需要的自提

不是在搬砖,就是搬砖的路上,希望你的程序永无bug


相关文章
|
2月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
7天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
4天前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
40 17
|
26天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
118 26
|
2月前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
61 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
2月前
|
Java Android开发
Eclipse 创建 Java 项目
Eclipse 创建 Java 项目
51 4
|
2月前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
50 3
|
2月前
|
前端开发 Java 数据库
如何实现一个项目,小白做项目-java
本教程涵盖了从数据库到AJAX的多个知识点,并详细介绍了项目实现过程,包括静态页面分析、数据库创建、项目结构搭建、JSP转换及各层代码编写。最后,通过通用分页和优化Servlet来提升代码质量。
70 1