一.概述
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