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
解决IDEA打开java项目出现橙色j无法运行
解决IDEA打开java项目出现橙色j无法运行
4 0
|
4天前
|
Java 应用服务中间件 Docker
【Docker】部署启动java项目
【Docker】部署启动java项目
13 2
|
5天前
|
搜索推荐 前端开发 Java
java医院绩效考核管理系统项目源码
系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
9 0
|
6天前
|
前端开发 Java 测试技术
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
Java从入门到精通:4.1.1参与实际项目,锻炼编程与问题解决能力
|
10天前
|
JavaScript Java 测试技术
基于Java的同城蔬菜配送管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的同城蔬菜配送管理系统的设计与实现(源码+lw+部署文档+讲解等)
12 0
|
5天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
3天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
1天前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
1天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
3天前
|
安全 Java
【JAVA】线程的run()和start()有什么区别?
【JAVA】线程的run()和start()有什么区别?