zoukankan      html  css  js  c++  java
  • java超市购物管理系统

    一.概述

    1.项目基于超市购物场景,通过java+mysql数据库模拟一个简单超市购物管理系统

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

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

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

    5.因为是java操作数据库的实战项目,不会详细讲解java环境搭建,数据库安装,sql语法这些知识。开始之前你总的把java开发环境安装好吧、数据库安装好吧、

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

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

    二:效果演示

    =================欢迎使用超市购物管理系统=================
    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包引入(可以去官网下载或者在我的公众号 java一号  回复  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 系统主界面
     */
    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("编号	"+"名称	"+"单价	"+"数量	");
    					if(rs.wasNull()){
    						System.out.println("没有商品");
    					}else{
    						while(rs.next()){//有结果,打印
    							//通过rs.getxxx("yy")方法参数是数据库列名
    							System.out.println(rs.getInt("id")+"	"+rs.getString("name")+"	"+
    									rs.getFloat("price")+"	"+rs.getInt("num")+"	");
    						}
    					}
    					//关闭连接
    					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("编号	"+"名称	"+"数量	"+"总价");
    		//lambda表达式遍历集合,当然是用for循环也ok
    		goods.forEach(in->System.out.println(in.getId()+"	"+in.getName()+
    				"	"+in.getNum()+"	"+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操作数据库而言可以参考,

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


  • 相关阅读:
    Linux之C编译器gcc和makefile使用简介
    基于OWin的Web服务器Katana发布版本3
    OAuth和OpenID的区别
    关于 Token,你应该知道的十件事
    HTTP Header 详解
    Entity Framework教程及文章传送门
    CSP(Content Security Policy) 入门教程
    gulp构建工具的几个使用技巧
    浅谈程序员的英语学习
    如何选择正确的angular2学习曲线?
  • 原文地址:https://www.cnblogs.com/javayihao/p/12012267.html
Copyright © 2011-2022 走看看