java超市購物管理系統


一.概述

1.收到很多朋友私信給我,也很感謝老鐵們的反饋和交流,前面這個項目只是對java基礎知識和面向對象的思想練習,但是沒有涉及到java如何操作數據庫,如何通過java將數據從數據庫拿出來,如果存進去這些問題。對於java新手來說,這些問題不知道從何處下手。有很多剛入門的java新手建議我寫個java操作數據庫的實戰項目供入門者參考,我想如果能幫助他們少花點時間出坑,何樂不為?鵬哥就特意思考了一天,整理了一下思路,今天就抽時間寫個超市購物管理系統.....go go go

2.超市購物管理系統涉及到的知識:java基礎語法,java面向對象的開發思想,java如何操作數據庫,集合方面的知識

3.適合java入門,不知道java如何操作數據庫

4.基本所有的代碼鵬哥會打上注釋,方便閱讀

5.因為是java操作數據庫的實戰項目,不會詳細講解java環境搭建,數據庫安裝,sql語法這些知識。所以開始之前你總的把java開發環境安裝好吧、數據庫安裝好吧、

6.開發工具eclipse;jdk是1.8;數據庫用的是mysql5.5 (當然sqlserver數據庫完全可以)

7.源碼獲取:我會將核心代碼粘貼出來,所有的代碼關注鵬哥公眾號  java一號  實戰項目中會給出

二:效果演示

=================歡迎使用超市購物管理系統=================
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 系統主界面
 * @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操作數據庫而言可以參考,

源碼我放在了公眾號  java一號  有需要的自提

微信公眾號:  java一號  

后台回復: 超市管理系統

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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM