Bootstrap

java项目超市购物管理系统

一.概述

1.三哥前面有写过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

;