一。概述 1。鹏哥前面有写过java项目超市管理系统项目,传送门 2。收到很多朋友私信给我,也很感谢老铁们的反馈和交流,前面这个项目只是对java基础知识和面向对象的思想练习,但是没有涉及到java如何操作数据库,如何通过java将数据从数据库拿出来,如果存进去这些问题。对于java新手来说,这些问题不知道从何处下手。有很多刚入门的java新手建议我写个java操作数据库的实战项目供入门者参考,我想如果能帮助他们少花点时间出坑,何乐不为?鹏哥就特意思考了一天,整理了一下思路,今天就抽时间写个超市购物管理系统。。。。。gogogo 3。超市购物管理系统涉及到的知识:java基础语法,java面向对象的开发思想,java如何操作数据库,集合方面的知识 4。适合java入门,不知道java如何操作数据库 5。基本所有的代码鹏哥会打上注释,方便阅读 6。因为是java操作数据库的实战项目,不会详细讲解java环境搭建,数据库安装,sql语法这些知识。太多了,我写一周不见得写完。。。。。或者可以去鹏哥站java一号查看相关文章。所以开始之前你总的把java开发环境安装好吧、数据库安装好吧、 7。开发工具jdk是1。8;数据库用的是mysql5。5(当然sqlserver数据库完全可以) 8。源码获取:我会将核心代码粘贴出来,所有的代码关注鹏哥公众号java一号实战项目中会给出 二:效果演示 欢迎使用超市购物管理系统1。商品入库2。根据商品编号查询商品3。商品列表4。购买商品5。删除商品6。更新商品0。退出系统请输入要执行的操作3编号名称单价数量1234苹果12。0351235衣服123。001236篮球200。020输入y继续否则退出y1。商品入库2。根据商品编号查询商品3。商品列表4。购买商品5。删除商品0。退出系统请输入要执行的操作4输入购买商品的编号1235输入购买商品的数量1此商品库存0无法购买;输入y继续购买输入其他结算y输入购买商品的编号1234输入购买商品的数量2购买成功输入y继续购买输入其他结算1236编号名称数量总价1234苹果224。0总计消费:24。0元输入y继续否则退出y1。商品入库2。根据商品编号查询商品3。商品列表4。购买商品5。删除商品0。退出系统请输入要执行的操作5输入要刪除的商品编号4564沒有此商品输入y继续否则退出y1。商品入库2。根据商品编号查询商品3。商品列表4。购买商品5。删除商品0。退出系统请输入要执行的操作3编号名称单价数量1234苹果12。0331235衣服123。001236篮球200。020输入y继续否则退出y1。商品入库2。根据商品编号查询商品3。商品列表4。购买商品5。删除商品0。退出系统请输入要执行的操作4输入购买商品的编号1234输入购买商品的数量2购买成功输入y继续购买输入其他结算y输入购买商品的编号1234输入购买商品的数量2购买成功输入y继续购买输入其他结算t编号名称数量总价1234苹果448。0总计消费:48。0元输入y继续否则退出 三:创建项目 在eclipse创建一个ShopManager项目 接着我们将数据库驱动jar包引入(可以去官网下载或者在我的公众号java一号回复jdbc即可获取,); java和这个数据库驱动有什么关系呢?简单理解就是这个数据库驱动是java和数据库中间的桥梁,用于两者通信。 创建lib的文件夹 将我们准备好的驱动复制到这个lib中 在这个驱动上右键执行 最后完整的结构 创建项目结构,很重要,很重要,很重要,这些都是开发要注意的,对于这些小项目而言,完全可以将所有的代码类都放在src下,但是以后项目越来越大,所有的类成千上百个,都放在src,没有分包的的话,项目项目其他开发者看到代码什么承受多少点伤害。 这个系统中比较简单,下面四个包就可以,其中app包用于放系统主入口类,pojo放系统涉及的实体类,service放系统业务,utils放系统中的工具类;test临时测试类 四:连接数据库 因为系统会涉及到多次对数据库中数据的访问,所以我们将连接数据库操作写成一个工具类DbUtil,不要每次涉及到操作数据库就写重复的连接代码。 packagecom。javayihao。top。importjava。sql。Cimportjava。sql。DriverMimportjava。sql。ResultSimportjava。sql。SQLEimportjava。sql。Sdate2019129Description连接数据库工具类authorcom。javayihao。toppublicclassDbUtil{把几个用于连接数据库的字符串定义成常量,不必每次去创建privatestaticfinalStringUSER数据库用户名privatestaticfinalStringUPWD数据库密码本地数据库shopprivatestaticfinalStringURLjdbc:mysql:localhost:3306驱动privatestaticfinalStringDRIVERcom。mysql。jdbc。D注册驱动static{try{Class。forName(DRIVER);}catch(ClassNotFoundExceptione){e。printStackTrace();}}得到数据库连接对象Connection的函数publicstaticConnectiongetConnection()throwsSQLException{returnDriverManager。getConnection(URL,USER,UPWD);}关闭连接和执行的打开资源publicstaticvoidclose(Connectionconnection,Statementstatement){if(statement!null){try{statement。close();}catch(SQLExceptione){e。printStackTrace();}}if(connection!null){try{connection。close();}catch(SQLExceptione){e。printStackTrace();}}}关闭所有的打开资源publicstaticvoidclose(Connectionconnection,Statementstatement,ResultSetrs){if(statement!null){try{statement。close();}catch(SQLExceptione){e。printStackTrace();}}if(connection!null){try{connection。close();}catch(SQLExceptione){e。printStackTrace();}}if(rs!null){try{rs。close();}catch(SQLExceptione){e。printStackTrace();}}}} 测试 packagecom。javayihao。top。importjava。sql。Cimportjava。sql。SQLEimportcom。javayihao。top。utils。DbUdate2019129Description测试数据库连接类authorcom。javayihao。toppublicclassDbUtilTest{publicstaticvoidmain(String〔〕args)throwsSQLException{ConnectionconDbUtil。getConnection();System。out。println(con);}} 如下,说明数据库连接成功 五:创建实体类 packagecom。javayihao。top。date2019129Description商品实体authorcom。javayihao。toppublicclassGood{商品编号商品名称privateS商品价格(价格可能涉及到小数,这里使用float,当然真正大型购物平台不会使用float,有兴趣的朋友可以上网了解)库存空参构造publicGood(){super();}打印方法OverridepublicStringtoString(){returnGood〔idid,namename,priceprice,numnum〕;}有参构造,方便初始化对象publicGood(intid,Stringname,floatprice,intnum){super();this。this。this。this。}setget方法publicintgetId(){}publicvoidsetId(intid){this。}publicStringgetName(){}publicvoidsetName(Stringname){this。}publicfloatgetPrice(){}publicvoidsetPrice(floatprice){this。}publicintgetNum(){}publicvoidsetNum(intnum){this。}} 六:数据库 本地创建数据库shop,创建表tgood CREATETABLEtgood(idint(5)NOTNULL,namevarchar(25)NOTNULL,pricefloat(10,2)NOTNULL,numint(5)NOTNULL,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8mb4; 七。核心业务 packagecom。javayihao。top。importjava。sql。Cimportjava。sql。PreparedSimportjava。sql。ResultSimportjava。sql。SQLEimportjava。util。ArrayLimportjava。util。Simportcom。javayihao。top。pojo。Gimportcom。javayihao。top。utils。DbUdate2019129Description系统主界面authorcom。javayihao。toppublicclassShopView{获取键盘输入对象ScannerinputnewScanner(System。in);系统运行方法publicvoidShopStart(){System。out。println(欢迎使用超市购物管理系统);是否继续的标志量,默认是StringisGdo{调用菜单那展示的函数showMenu();System。out。println(请输入要执行的操作);接受键盘的输入,这里使用String,一次性处理数字和字符输入,不建议使用int类型数字Stringselectinput。next();根据输入的选择执行对应的方法switch(select){执行商品入库方法case1:insertGood();执行商品查詢方法case2:System。out。println(输入要查询的商品编号);intgoodIdinput。nextInt();调用查询商品的方法,GoodgoodsearchGoodById(goodId);存在if(good!null){System。out。println(商品编号:goodId商品名称:good。getName()商品价格:good。getPrice()商品数量:good。getNum());}else{System。out。println(此商品不存在);}执行商品列表方法case3:getGoodList();执行商品购买方法case4:buyGood();执行商品购买方法case5:System。out。println(输入要刪除的商品编号);intidinput。nextInt();调用查询商品的方法,if(searchGoodById(id)!null){deleteGood(id);}else{System。out。println(沒有此商品);}case6:updateGood();退出系统case0:System。out。println(欢迎下次使用再见!);终止程序System。exit(0);default:System。err。println(输入有误请重新输入!);}System。out。println(输入y继续否则退出);isGoinput。next();}while(isGo。equals(y));System。out。println(欢迎下次使用再见!);}更新商品操作1。先查询当前要更新的商品存不存在2。如果存在更新即可,不存在提示privatevoidupdateGood(){System。out。println(输入要修改的商品id);intgidinput。nextInt();GoodgoodsearchGoodById(gid);System。out。println(商品信息如下);if(good!null){System。out。println(商品编号:gid商品名称:good。getName()商品价格:good。getPrice()商品数量:good。getNum());System。out。println(修改商品名称);Stringnameinput。next();System。out。println(修改商品单价);floatpriceinput。nextFloat();System。out。println(修改商品库存);intnuminput。nextInt();Stringsqlupdatetgoodsetname?,price?,num?whereid?;try{创建一个操作数据库的对象ConnectionconDbUtil。getConnection();创建执行sql的执行对象PreparedStatementPreparedStatementpstcon。prepareStatement(sql);给占位符设置值pst。setString(1,name);pst。setFloat(2,price);pst。setInt(3,num);pst。setInt(4,gid);如果是查询的话execute()返回true,如果是更新或插入的话就返回falseif(!pst。execute()){System。out。println(更新成功);}关闭连接DbUtil。close(con,pst);}catch(Exceptione){e。printStackTrace();System。out。println(更新异常e。getMessage());}}else{System。out。println(此商品不存在);}}用于展示系统界面菜单的方法privatevoidshowMenu(){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删除privatevoiddeleteGood(intid){Stringsqldeletefromtgoodwhereid?;try{创建一个操作数据库的对象ConnectionconDbUtil。getConnection();创建执行sql的执行对象PreparedStatementPreparedStatementpstcon。prepareStatement(sql);给占位符设置值pst。setInt(1,id);如果是查询的话execute()返回true,如果是更新或插入的话就返回falseif(!pst。execute()){System。out。println(刪除成功);}关闭连接DbUtil。close(con,pst);}catch(Exceptione){e。printStackTrace();System。out。println(删除异常e。getMessage());}}商品入库这里只处理编号不能重复的逻辑,关于输入的编号是不是数字这里就不做判断,有兴趣的朋友可以试试privatevoidinsertGood(){商品编号intid0;System。out。println(输入商品编号);while(true){idinput。nextInt();判断当前输入的编号重复没有,重复重新输入if(searchGoodById(id)null){}System。err。println(编号重复,请重新输入商品编号);}System。out。println(输入商品名称);Stringnameinput。next();System。out。println(输入商品单价);floatpriceinput。nextFloat();System。out。println(输入商品数量);intnuminput。nextInt();要执行的sql语句,这里使用占位符防止sql入侵Stringsqlinsertintotgood()values(?,?,?,?);try{创建一个操作数据库的对象ConnectionconDbUtil。getConnection();创建执行sql的执行对象PreparedStatementPreparedStatementpstcon。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(Exceptione){e。printStackTrace();System。out。println(入库异常e。getMessage());}}商品查询返回的是一个商品对象,没有此商品返回nullprivateGoodsearchGoodById(intid){执行的sql语句Stringsqlselectid,name,price,numfromtgoodwhereid?;try{创建一个操作数据库的对象ConnectionconDbUtil。getConnection();创建执行sql的对象PreparedStatementPreparedStatementpstcon。prepareStatement(sql);pst。setInt(1,id);ResultSetrspst。executeQuery();if(rs。next()){有结果,将查到的数据通过构造函数封装成一个商品对象GoodgoodnewGood(rs。getInt(id),rs。getString(name),rs。getFloat(price),rs。getInt(num));}关闭连接DbUtil。close(con,pst);}catch(SQLExceptione){e。printStackTrace();}}商品列表privatevoidgetGoodList(){执行的sql语句Stringsqlselectid,name,price,try{创建一个操作数据库的对象ConnectionconDbUtil。getConnection();创建执行sql的对象PreparedStatementPreparedStatementpstcon。prepareStatement(sql);ResultSetrspst。executeQuery();System。out。println(编号名称单价数量);if(rs。wasNull()){System。out。println(没有商品);}else{while(rs。next()){有结果,打印通过rs。getxxx(yy)方法参数是数据库列名System。out。println(rs。getInt(id)rs。getString(name)rs。getFloat(price)rs。getInt(num));}}关闭连接DbUtil。close(con,pst);}catch(SQLExceptione){e。printStackTrace();}}购买商品publicvoidbuyGood(){用来存储购买商品的集合ArrayLgoodsnewArrayL();是否继续购买标记Sdo{System。out。println(输入购买商品的编号);intidinput。nextInt();GoodgoodsearchGoodById(id);if(good!null){System。out。println(输入购买商品的数量);intnuminput。nextInt();if(good。getNum()num){stringsqlupdatetgoodsetnum?whereid?;connectionconDbUtil。getConnection();preparedstatementpstcon。prepareStatement(sql);0){for(inti0;goods。size();i){if(goods。get(i)。getId()id){如果购物车中有该商品数量加即可goods。get(0)。setNum(numgoods。get(0)。getNum());}else{如果购物车中没有该商品数量加即可goods。add(g);}}}else{购物车中没有商品,加入到购物车中goods。add(g);}System。out。println(购买成功);}else{System。out。println(购买失敗);}}catch(Exceptione){e。printStackTrace();System。out。println(购买异常e。getMessage());}}System。out。println(输入y继续购买输入其他结算);flaginput。next();if(!flag。equals(y)){结算account(goods);}}else{System。out。println(没有此商品);}}while(flag。equals(y));}结算购物车privatevoidaccount(ArrayLgoods){System。out。println(编号名称数量总价);lambda表达式遍历集合,当然是用for循环也okgoods。forEach(System。out。println(in。getId()in。getName()in。getNum()in。getNum()in。getPrice()));合计floatsum0;for(inti0;goods。size();i){对总价求和sum(goods。get(i)。getNum())(goods。get(i)。getPrice());}System。out。println(总计消费:sum元);}}num){ 总结 至此,项目已经完成了,当然项目本身还是存在不足,比如,在接受键盘输入的合法性判断。对于java操作数据库而言可以参考,不是在搬砖,就是搬砖的路上,希望你的程序永无bug