一.概述1.鵬哥前面有寫過(guò)java項(xiàng)目超市管理系統(tǒng)項(xiàng)目,傳送門 2.收到很多朋友私信給我,也很感謝老鐵們的反饋和交流,前面這個(gè)項(xiàng)目只是對(duì)java基礎(chǔ)知識(shí)和面向?qū)ο蟮乃枷刖毩?xí),但是沒(méi)有涉及到j(luò)ava如何操作數(shù)據(jù)庫(kù),如何通過(guò)java將數(shù)據(jù)從數(shù)據(jù)庫(kù)拿出來(lái),如果存進(jìn)去這些問(wèn)題。對(duì)于java新手來(lái)說(shuō),這些問(wèn)題不知道從何處下手。有很多剛?cè)腴T的java新手建議我寫個(gè)java操作數(shù)據(jù)庫(kù)的實(shí)戰(zhàn)項(xiàng)目供入門者參考,我想如果能幫助他們少花點(diǎn)時(shí)間出坑,何樂(lè)不為?鵬哥就特意思考了一天,整理了一下思路,今天就抽時(shí)間寫個(gè)超市購(gòu)物管理系統(tǒng).....go
go go 3.超市購(gòu)物管理系統(tǒng)涉及到的知識(shí):java基礎(chǔ)語(yǔ)法,java面向?qū)ο蟮拈_(kāi)發(fā)思想,java如何操作數(shù)據(jù)庫(kù),集合方面的知識(shí) 4.適合java入門,不知道java如何操作數(shù)據(jù)庫(kù) 5.基本所有的代碼鵬哥會(huì)打上注釋,方便閱讀 6.因?yàn)槭莏ava操作數(shù)據(jù)庫(kù)的實(shí)戰(zhàn)項(xiàng)目,不會(huì)詳細(xì)講解java環(huán)境搭建,數(shù)據(jù)庫(kù)安裝,sql語(yǔ)法這些知識(shí)。太多了,我寫一周不見(jiàn)得寫完.....或者可以去鵬哥站 java一號(hào) 查看相關(guān)文章。所以開(kāi)始之前你總的把java開(kāi)發(fā)環(huán)境安裝好吧、數(shù)據(jù)庫(kù)安裝好吧、 7.開(kāi)發(fā)工具eclipse;jdk是1.8;數(shù)據(jù)庫(kù)用的是mysql5.5 (當(dāng)然sqlserver數(shù)據(jù)庫(kù)完全可以) 8.源碼獲取:我會(huì)將核心代碼粘貼出來(lái),所有的代碼關(guān)注鵬哥公眾號(hào) java一號(hào) 實(shí)戰(zhàn)項(xiàng)目中會(huì)給出 二:效果演示=================歡迎使用超市購(gòu)物管理系統(tǒng)=================
1.商品入庫(kù)
2.根據(jù)商品編號(hào)查詢商品
3.商品列表
4.購(gòu)買商品
5.刪除商品
6.更新商品
0.退出系統(tǒng)
請(qǐng)輸入要執(zhí)行的操作
3
編號(hào) 名稱 單價(jià) 數(shù)量
1234 蘋果 12.0 35
1235 衣服 123.0 0
1236 籃球 200.0 20
輸入y繼續(xù)/否則退出
y
1.商品入庫(kù)
2.根據(jù)商品編號(hào)查詢商品
3.商品列表
4.購(gòu)買商品
5.刪除商品
0.退出系統(tǒng)
請(qǐng)輸入要執(zhí)行的操作
4
輸入購(gòu)買商品的編號(hào)
1235
輸入購(gòu)買商品的數(shù)量
1
此商品庫(kù)存0 無(wú)法購(gòu)買;
輸入y繼續(xù)購(gòu)買/輸入其他結(jié)算
y
輸入購(gòu)買商品的編號(hào)
1234
輸入購(gòu)買商品的數(shù)量
2
購(gòu)買成功
輸入y繼續(xù)購(gòu)買/輸入其他結(jié)算
1236
編號(hào) 名稱 數(shù)量 總價(jià)
1234 蘋果 2 24.0
總計(jì)消費(fèi):24.0元
輸入y繼續(xù)/否則退出
y
1.商品入庫(kù)
2.根據(jù)商品編號(hào)查詢商品
3.商品列表
4.購(gòu)買商品
5.刪除商品
0.退出系統(tǒng)
請(qǐng)輸入要執(zhí)行的操作
5
輸入要?jiǎng)h除的商品編號(hào)
4564
沒(méi)有此商品
輸入y繼續(xù)/否則退出
y
1.商品入庫(kù)
2.根據(jù)商品編號(hào)查詢商品
3.商品列表
4.購(gòu)買商品
5.刪除商品
0.退出系統(tǒng)
請(qǐng)輸入要執(zhí)行的操作
3
編號(hào) 名稱 單價(jià) 數(shù)量
1234 蘋果 12.0 33
1235 衣服 123.0 0
1236 籃球 200.0 20
輸入y繼續(xù)/否則退出
y
1.商品入庫(kù)
2.根據(jù)商品編號(hào)查詢商品
3.商品列表
4.購(gòu)買商品
5.刪除商品
0.退出系統(tǒng)
請(qǐng)輸入要執(zhí)行的操作
4
輸入購(gòu)買商品的編號(hào)
1234
輸入購(gòu)買商品的數(shù)量
2
購(gòu)買成功
輸入y繼續(xù)購(gòu)買/輸入其他結(jié)算
y
輸入購(gòu)買商品的編號(hào)
1234
輸入購(gòu)買商品的數(shù)量
2
購(gòu)買成功
輸入y繼續(xù)購(gòu)買/輸入其他結(jié)算
t
編號(hào) 名稱 數(shù)量 總價(jià)
1234 蘋果 4 48.0
總計(jì)消費(fèi):48.0元
輸入y繼續(xù)/否則退出
三:創(chuàng)建項(xiàng)目在eclipse創(chuàng)建一個(gè)ShopManager項(xiàng)目 接著我們將數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar包引入(可以去官網(wǎng)下載或者在我的公眾號(hào) java一號(hào) 回復(fù) jdbc 即可獲取,); java和這個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)有什么關(guān)系呢?簡(jiǎn)單理解就是這個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)是java和數(shù)據(jù)庫(kù)中間的橋梁,用于兩者通信。 創(chuàng)建lib的文件夾 將我們準(zhǔn)備好的驅(qū)動(dòng)復(fù)制到這個(gè)lib中 在這個(gè)驅(qū)動(dòng)上右鍵執(zhí)行
最后完整的結(jié)構(gòu) 創(chuàng)建項(xiàng)目結(jié)構(gòu),很重要,很重要,很重要,這些都是開(kāi)發(fā)要注意的,對(duì)于這些小項(xiàng)目而言,完全可以將所有的代碼類都放在src下,但是以后項(xiàng)目越來(lái)越大,所有的類成千上百個(gè),都放在src,沒(méi)有分包的的話,項(xiàng)目項(xiàng)目其他開(kāi)發(fā)者看到代碼什么承受多少點(diǎn)傷害。 這個(gè)系統(tǒng)中比較簡(jiǎn)單,下面四個(gè)包就可以,其中app包用于放系統(tǒng)主入口類,pojo放系統(tǒng)涉及的實(shí)體類,service放系統(tǒng)業(yè)務(wù),utils放系統(tǒng)中的工具類;test臨時(shí)測(cè)試類 四:連接數(shù)據(jù)庫(kù)因?yàn)橄到y(tǒng)會(huì)涉及到多次對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的訪問(wèn),所以我們將連接數(shù)據(jù)庫(kù)操作寫成一個(gè)工具類DbUtil,不要每次涉及到操作數(shù)據(jù)庫(kù)就寫重復(fù)的連接代碼。 package com..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 連接數(shù)據(jù)庫(kù)工具類
* @author com.
*/public class DbUtil { //把幾個(gè)用于連接數(shù)據(jù)庫(kù)的字符串定義成常量,不必每次去創(chuàng)建 private static final String USER = "root";//數(shù)據(jù)庫(kù)用戶名 private static final String UPWD = "root";//數(shù)據(jù)庫(kù)密碼 //本地?cái)?shù)據(jù)庫(kù)shop private static final String URL = "jdbc:mysql://localhost:3306/shop"; //驅(qū)動(dòng) private static final String DRIVER = "com.mysql.jdbc.Driver"; //注冊(cè)驅(qū)動(dòng) static { try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} //得到數(shù)據(jù)庫(kù)連接對(duì)象Connection的函數(shù) public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, UPWD);
} //關(guān)閉連接和 執(zhí)行 的打開(kāi)資源 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();
}
}
} //關(guān)閉所有的打開(kāi)資源 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();
}
}
}
}
測(cè)試 package com..test;import java.sql.Connection;import java.sql.SQLException;import com..utils.DbUtil;/**
* @date 2019-12-9
* @Description 測(cè)試數(shù)據(jù)庫(kù)連接類
* @author com.
*/public class DbUtilTest { public static void main(String[] args) throws SQLException {
Connection con = DbUtil.getConnection();
System.out.println(con);
}
}
如下,說(shuō)明數(shù)據(jù)庫(kù)連接成功 五:創(chuàng)建實(shí)體類package com..pojo;/**
* @date 2019-12-9
* @Description 商品實(shí)體
* @author com.
*/public class Good { //商品編號(hào) private int id; //商品名稱 private String name; //商品價(jià)格(價(jià)格可能涉及到小數(shù),這里使用float,當(dāng)然真正大型購(gòu)物平臺(tái)不會(huì)使用float,有興趣的朋友可以上網(wǎng)了解) private float price; //庫(kù)存 private int num; //空參構(gòu)造 public Good() { super();
} //打印方法 @Override public String toString() { return "Good [id=" + id + ", name=" + name + ", price=" + price + ", num=" + num + "]";
} //有參構(gòu)造,方便初始化對(duì)象 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;
}
}
六:數(shù)據(jù)庫(kù)本地創(chuàng)建數(shù)據(jù)庫(kù)shop,創(chuàng)建表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;
七.核心業(yè)務(wù)
package com..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..pojo.Good;
import com..utils.DbUtil;
/**
* @date 2019-12-9
* @Description 系統(tǒng)主界面
* @author com.
*/
public class ShopView {
//獲取鍵盤輸入對(duì)象
Scanner input = new Scanner(System.in);
/*
* 系統(tǒng)運(yùn)行方法
*/
public void ShopStart() {
System.out.println("=================歡迎使用超市購(gòu)物管理系統(tǒng)=================");
//是否繼續(xù)的標(biāo)志量,默認(rèn)是
String isGo="y";
do{
//調(diào)用菜單那展示的函數(shù)
showMenu();
System.out.println("請(qǐng)輸入要執(zhí)行的操作");
//接受鍵盤的輸入,這里使用String,一次性處理數(shù)字和字符輸入,不建議使用int類型數(shù)字
String select =input.next();
//根據(jù)輸入的選擇執(zhí)行對(duì)應(yīng)的方法
switch (select) {
//執(zhí)行商品入庫(kù)方法
case "1":
insertGood();
break;
//執(zhí)行商品查詢方法
case "2":
System.out.println("輸入要查詢的商品編號(hào)");
int goodId = input.nextInt();
//調(diào)用查詢商品的方法,
Good good = searchGoodById(goodId);
//存在
if(good!=null){
System.out.println("商品編號(hào):"+goodId+" 商品名稱:"+good.getName()
+" 商品價(jià)格:"+good.getPrice()+" 商品數(shù)量:"+good.getNum());
}else{
System.out.println("此商品不存在");
}
break;
//執(zhí)行商品列表方法
case "3":
getGoodList();
break;
//執(zhí)行商品購(gòu)買方法
case "4":
buyGood();
break;
//執(zhí)行商品購(gòu)買方法
case "5":
System.out.println("輸入要?jiǎng)h除的商品編號(hào)");
int id = input.nextInt();
//調(diào)用查詢商品的方法,
if(searchGoodById(id)!=null){
deleteGood(id);
}else{
System.out.println("沒(méi)有此商品");
}
break;
case "6":
updateGood();
break;
//退出系統(tǒng)
case "0":
System.out.println("*************歡迎下次使用 再見(jiàn)!*************");
//終止程序
System.exit(0);
default:
System.err.println("輸入有誤 請(qǐng)重新輸入!");
continue;
}
System.out.println("輸入y繼續(xù)/否則退出");
isGo = input.next();
}while(isGo.equals("y"));
System.out.println("*************歡迎下次使用 再見(jiàn)!*************");
}
/**
* 更新商品操作
* 1.先查詢當(dāng)前要更新的商品存不存在
* 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("商品編號(hào):"+gid+" 商品名稱:"+good.getName()
+" 商品價(jià)格:"+good.getPrice()+" 商品數(shù)量:"+good.getNum());
System.out.println("修改商品名稱");
String name = input.next();
System.out.println("修改商品單價(jià)");
float price = input.nextFloat();
System.out.println("修改商品庫(kù)存");
int num = input.nextInt();
String sql="update t_good set name=?,price=?,num=? where id=? ";
try {
//創(chuàng)建一個(gè)操作數(shù)據(jù)庫(kù)的對(duì)象
Connection con = DbUtil.getConnection();
//創(chuàng)建執(zhí)行sql的執(zhí)行對(duì)象PreparedStatement
PreparedStatement pst = con.prepareStatement(sql);
//給占位符設(shè)置值
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("更新成功");
}
//關(guān)閉連接
DbUtil.close(con, pst);
} catch (Exception e) {
e.printStackTrace();
System.out.println("更新異常"+e.getMessage());
}
}else{
System.out.println("此商品不存在");
}
}
//用于展示系統(tǒng)界面菜單的方法
private void showMenu() {
System.out.println("1.商品入庫(kù)");
System.out.println("2.根據(jù)商品編號(hào)查詢商品");
System.out.println("3.商品列表");
System.out.println("4.購(gòu)買商品");
System.out.println("5.刪除商品");
System.out.println("6.更新商品");
System.out.println("0.退出系統(tǒng)");
}
/*
* 刪除商品
* 1.首先得判斷該商品存在
* 2.根據(jù)商品編號(hào)id刪除
*/
private void deleteGood(int id) {
String sql = "delete from t_good where id=?";
try {
//創(chuàng)建一個(gè)操作數(shù)據(jù)庫(kù)的對(duì)象
Connection con = DbUtil.getConnection();
//創(chuàng)建執(zhí)行sql的執(zhí)行對(duì)象PreparedStatement
PreparedStatement pst = con.prepareStatement(sql);
//給占位符設(shè)置值
pst.setInt(1, id);
//如果是查詢的話execute()返回true,如果是更新或插入的話就返回false
if(!pst.execute()){
System.out.println("刪除成功");
}
//關(guān)閉連接
DbUtil.close(con, pst);
} catch (Exception e) {
e.printStackTrace();
System.out.println("刪除異常"+e.getMessage());
}
}
/*
* 商品入庫(kù)
* 這里只處理編號(hào)不能重復(fù)的邏輯,
* 關(guān)于輸入的編號(hào)是不是數(shù)字這里就不做判斷,有興趣的朋友可以試試
*/
private void insertGood(){
//商品編號(hào)
int id=0;
System.out.println("輸入商品編號(hào)");
while(true){
id= input.nextInt();
//判斷當(dāng)前輸入的編號(hào)重復(fù)沒(méi)有,重復(fù)重新輸入
if(searchGoodById(id)==null){
break;
}
System.err.println("編號(hào)重復(fù),請(qǐng)重新輸入商品編號(hào)");
}
System.out.println("輸入商品名稱");
String name = input.next();
System.out.println("輸入商品單價(jià)");
float price = input.nextFloat();
System.out.println("輸入商品數(shù)量");
int num = input.nextInt();
//要執(zhí)行的sql語(yǔ)句,這里使用占位符防止sql入侵
String sql = "insert into t_good()values(?,?,?,?)";
try {
//創(chuàng)建一個(gè)操作數(shù)據(jù)庫(kù)的對(duì)象
Connection con = DbUtil.getConnection();
//創(chuàng)建執(zhí)行sql的執(zhí)行對(duì)象PreparedStatement
PreparedStatement pst = con.prepareStatement(sql);
//給占位符設(shè)置值
pst.setInt(1, id);
pst.setString(2, name);
pst.setFloat(3, price);
pst.setInt(4, num);
//執(zhí)行sql語(yǔ)句
if(!pst.execute()){
System.out.println("入庫(kù)成功");
}
//關(guān)閉連接
DbUtil.close(con, pst);
} catch (Exception e) {
e.printStackTrace();
System.out.println("入庫(kù)異常"+e.getMessage());
}
}
/*商品查詢
* 返回的是一個(gè)商品對(duì)象,沒(méi)有此商品返回null
*/
private Good searchGoodById(int id) {
//執(zhí)行的sql語(yǔ)句
String sql="select id,name,price,num from t_good where id=?";
try {
//創(chuàng)建一個(gè)操作數(shù)據(jù)庫(kù)的對(duì)象
Connection con = DbUtil.getConnection();
//創(chuàng)建執(zhí)行sql的對(duì)象PreparedStatement
PreparedStatement pst = con.prepareStatement(sql);
pst.setInt(1, id);
ResultSet rs = pst.executeQuery();
if(rs.next()){//有結(jié)果,將查到的數(shù)據(jù)通過(guò)構(gòu)造函數(shù)封裝成一個(gè)商品對(duì)象
Good good = new Good(rs.getInt("id"), rs.getString("name"),
rs.getFloat("price"), rs.getInt("num"));
return good;
}
//關(guān)閉連接
DbUtil.close(con, pst);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//商品列表
private void getGoodList(){
//執(zhí)行的sql語(yǔ)句
String sql="select id,name,price,num from t_good";
try {
//創(chuàng)建一個(gè)操作數(shù)據(jù)庫(kù)的對(duì)象
Connection con = DbUtil.getConnection();
//創(chuàng)建執(zhí)行sql的對(duì)象PreparedStatement
PreparedStatement pst = con.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
System.out.println("編號(hào)\t"+"名稱\t"+"單價(jià)\t"+"數(shù)量\t");
if(rs.wasNull()){
System.out.println("沒(méi)有商品");
}else{
while(rs.next()){//有結(jié)果,打印
//通過(guò)rs.getxxx("yy")方法參數(shù)是數(shù)據(jù)庫(kù)列名
System.out.println(rs.getInt("id")+"\t"+rs.getString("name")+"\t"+
rs.getFloat("price")+"\t"+rs.getInt("num")+"\t");
}
}
//關(guān)閉連接
DbUtil.close(con, pst);
} catch (SQLException e) {
e.printStackTrace();
}
}
//購(gòu)買商品
public void buyGood() {
//用來(lái)存儲(chǔ)購(gòu)買商品的集合
ArrayList<Good> goods = new ArrayList<>();
//是否繼續(xù)購(gòu)買標(biāo)記
String flag = "y";
do{
System.out.println("輸入購(gòu)買商品的編號(hào)");
int id = input.nextInt();
Good good = searchGoodById(id);
if(good!=null){
System.out.println("輸入購(gòu)買商品的數(shù)量");
int num = input.nextInt();
if(good.getNum()<num){
System.out.println("此商品庫(kù)存"+good.getNum()+" 無(wú)法購(gòu)買;");
}else{
try{
String sql="update t_good set num=? where id=?";
//創(chuàng)建一個(gè)操作數(shù)據(jù)庫(kù)的對(duì)象
Connection con = DbUtil.getConnection();
//創(chuàng)建執(zhí)行sql的對(duì)象PreparedStatement
PreparedStatement pst = con.prepareStatement(sql);
pst.setInt(1, good.getNum()-num);//更新庫(kù)存
pst.setInt(2, id);
if(pst.executeUpdate()==1){
//存入購(gòu)買商品的集合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){//如果購(gòu)物車中有該商品 數(shù)量加即可
goods.get(0).setNum(num+goods.get(0).getNum());
}else{//如果購(gòu)物車中沒(méi)有該商品 數(shù)量加即可
goods.add(g);
}
}
}else{//購(gòu)物車中沒(méi)有商品,加入到購(gòu)物車中
goods.add(g);
}
System.out.println("購(gòu)買成功");
}else{
System.out.println("購(gòu)買失敗");
}
}catch(Exception e){
e.printStackTrace();
System.out.println("購(gòu)買異常"+e.getMessage());
}
}
System.out.println("輸入y繼續(xù)購(gòu)買/輸入其他結(jié)算");
flag = input.next();
if(!flag.equals("y")){
//結(jié)算
account(goods);
}
}else{
System.out.println("沒(méi)有此商品");
}
}while(flag.equals("y"));
}
//結(jié)算購(gòu)物車
private void account(ArrayList<Good> goods) {
System.out.println("編號(hào)\t"+"名稱\t"+"數(shù)量\t"+"總價(jià)");
//lambda表達(dá)式遍歷集合,當(dāng)然是用for循環(huán)也ok
goods.forEach(in->System.out.println(in.getId()+"\t"+in.getName()+
"\t"+in.getNum()+"\t"+in.getNum()*in.getPrice()));
//合計(jì)
float sum=0;
for (int i = 0; i < goods.size(); i++) {
//對(duì)總價(jià)求和
sum += (goods.get(i).getNum())*(goods.get(i).getPrice());
}
System.out.println("總計(jì)消費(fèi):"+sum+"元");
}
}
總結(jié)至此,項(xiàng)目已經(jīng)完成了,當(dāng)然項(xiàng)目本身還是存在不足,比如,在接受鍵盤輸入的合法性判斷。對(duì)于java操作數(shù)據(jù)庫(kù)而言可以參考,不是在搬磚,就是搬磚的路上,希望你的程序永無(wú)bug
|