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ù)/否則退出y1.商品入庫(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ù)/否則退出y1.商品入庫(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ù)/否則退出y1.商品入庫(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ù)/否則退出y1.商品入庫(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ù)/否則退出
在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è)試類
因?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.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 連接數(shù)據(jù)庫(kù)工具類 * @author com.javayihao.top */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.javayihao.top.test;import java.sql.Connection;import java.sql.SQLException;import com.javayihao.top.utils.DbUtil;/** * @date 2019-12-9 * @Description 測(cè)試數(shù)據(jù)庫(kù)連接類 * @author com.javayihao.top */public class DbUtilTest { public static void main(String[] args) throws SQLException { Connection con = DbUtil.getConnection(); System.out.println(con); }}
如下,說(shuō)明數(shù)據(jù)庫(kù)連接成功
package com.javayihao.top.pojo;/** * @date 2019-12-9 * @Description 商品實(shí)體 * @author com.javayihao.top */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; }}
本地創(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;
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 系統(tǒng)主界面 * @author com.javayihao.top */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+"元"); }}
至此,項(xiàng)目已經(jīng)完成了,當(dāng)然項(xiàng)目本身還是存在不足,比如,在接受鍵盤輸入的合法性判斷。對(duì)于java操作數(shù)據(jù)庫(kù)而言可以參考,不是在搬磚,就是搬磚的路上,希望你的程序永無(wú)bug
聯(lián)系客服