商品管理系统(存储到数据库中)
简介
第一次博客 有错误可以私信我 谢谢大家的指正。
如果写的可以希望大家可以关注一下,会继续更新学习历程 一起学习进步。
源码在最后
项目要求
- 能根据项目需求设计合理的实体类
- 规范的编码
- 关闭程序后,录入的数据下次打开程序还存在
项目需求
- 商品添加(输入商品编码、名称、价格、数量)
- 商品列表展示
- 商品入库(输入商品编号,然后提示用户输入入库数量,进行入库)
- 商品出库(输入商品编号,提示用户输入出库数量,进行出库)
- 修改商品价格(提示用户输入编号,录入新价格)
- 删除商品(提示用户输入编号,确认是否删除)
准备工作
软件准备
- 有 数据库 ;IDEA
- 下载jar包 点此搜索下载- mysql 的- c3p0 连接池的
- 导入jar包
文件准备
- 创建包
- DataSouce.properties配置类信息文件
# 数据库配置信息jdbc_url=jdbc:mysql://localhost:3306/tablesjdbc_driver=com.mysql.cj.jdbc.Driverjdbc_user=123jdbc_password=123
- Env类读取属性文件的组件类
import java.io.IOException;import java.io.InputStream;import java.util.Properties;/** * 读取属性文件加载类 */publicfinalclassEnvextendsProperties{publicstaticfinal String JDBC_URL;publicstaticfinal String JDBC_DRIVER;publicstaticfinal String JDBC_USER;publicstaticfinal String JDBC_PASSWORD;publicstatic Env env;/* 数据库属性文件的路径和名称 */publicstaticfinal String CONF_FILE="com\\sjtest\\conf\\DataSouce.properties";static{if(env==null){//当Env为空的时候赋值 env=newEnv();}//获取属性文件的文件流 InputStream input = env.getClass().getClassLoader().getResourceAsStream(CONF_FILE);try{ env.load(input);//加载文件流}catch(IOException e){ e.printStackTrace();}finally{try{ input.close();}catch(IOException e){ e.printStackTrace();}}//赋值 JDBC_URL=env.getProperty("jdbc_url"); JDBC_DRIVER=env.getProperty("jdbc_driver"); JDBC_USER=env.getProperty("jdbc_user"); JDBC_PASSWORD=env.getProperty("jdbc_password");}}
- DataSourPool类数据源管理组件类
import com.mchange.v2.c3p0.ComboPooledDataSource;import java.beans.PropertyVetoException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;publicclassDataSourPool{privatestatic ComboPooledDataSource c3p0;/**
* 创建 ComboPooledDataSource 数据源
*/privatestaticvoidcreateComboPooledDataSource(){if(c3p0==null){//如果c3p0是空的 赋值
c3p0=newComboPooledDataSource();}/*
数据源相关属性
*/try{
c3p0.setDriverClass(Env.JDBC_DRIVER);
c3p0.setUser(Env.JDBC_USER);
c3p0.setPassword(Env.JDBC_PASSWORD);
c3p0.setJdbcUrl(Env.JDBC_URL);}catch(PropertyVetoException e){
e.printStackTrace();}}/**
* 获取Connection 接口的方法
* @return
*/publicstatic Connection getConnection(){
Connection conn=null;createComboPooledDataSource();//创建数据源try{
conn=c3p0.getConnection();//有数据源获取打开一个连接}catch(SQLException throwables){
throwables.printStackTrace();}return conn;}/*
方法重载
*//**
* 关闭方法
* @param conn
*/publicstaticvoidclose(Connection conn){try{if(conn!=null){
conn.close();}}catch(SQLException throwables){
throwables.printStackTrace();}}publicstaticvoidclose(Statement state){try{if(state!=null){
state.close();}}catch(SQLException throwables){
throwables.printStackTrace();}}publicstaticvoidclose(ResultSet resu){try{if(resu != null){
resu.close();}}catch(SQLException throwables){
throwables.printStackTrace();}}}
- Goods类商品的实体类
/** * 映射商品表 */publicclassGoods{//商品编号private String id;//商品名称private String name;//商品价格privateint price;//商品数量privateint number;/* 定义有参 无参的构造器 */publicGoods(){}publicGoods(String id, String name,int price,int number){this.id = id;this.name = name;this.price = price;this.number = number;}public String getId(){return id;}publicvoidsetId(String id){this.id = id;}public String getName(){return name;}publicvoidsetName(String name){this.name = name;}publicintgetPrice(){return price;}publicvoidsetPrice(int price){this.price = price;}publicintgetNumber(){return number;}publicvoidsetNumber(int number){this.number = number;}/* 重写toString方法 */@Overridepublic String toString(){return"Goods{"+"id='"+ id +'\''+", name='"+ name +'\''+", price="+ price +", number="+ number +'}';}}
- Util 类工具类注意
import com.sjtest.Exception.NoneException;import com.sjtest.pojo.Goods;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;publicclassUtil{/** * 获取全部商品列表 * * @return 全部商品信息 */publicstatic List<Goods>AllGoods(){ List<Goods> list =newArrayList<>(); String sql ="select id 商品编号 ,name 商品名称,price 商品价格, number 商品数量 from goods"; Connection conn = DataSourPool.getConnection();//获取数据库连接 PreparedStatement ps = null;//创建 PreparedStatement 接口 ResultSet set = null;//创建 ResultSet 接口try{ ps = conn.prepareStatement(sql);//获取PreparedStatement 接口对象 set = ps.executeQuery();//查询返回ResultSet 结果集对象/* 处理结果集 封装结果集中的对象 */while(set.next()){ Goods goods =newGoods(); goods.setId(set.getString(1)); goods.setName(set.getString(2)); goods.setPrice(set.getInt(3)); goods.setNumber(set.getInt(4)); list.add(goods);}}catch(SQLException throwables){ throwables.printStackTrace();}finally{//关闭连接 DataSourPool.close(conn); DataSourPool.close(ps); DataSourPool.close(set);}return list;}/** * 给一个id 查询 商品 * * @param id 商品编号 * @return */publicstatic Goods findIDOutGoods(String id){ List<Goods> list = Util.AllGoods();for(Goods goods : list){if(goods.getId().equals(id)){return goods;}}//如果目标不存在抛异常try{thrownewNoneException("查找目标不存在");//自定义异常类}catch(NoneException e){ e.printStackTrace();}return null;}/** * 显示所有id和名称 */publicstaticvoidshowIDAndName(){ List<Goods> list = Util.AllGoods();for(Goods goods : list){ System.out.println(goods.getId()+"---"+goods.getName());}}}
- GoodsDao接口定义方法
import com.sjtest.pojo.Goods;publicinterfaceGoodsDao{/** * 商品添加(输入商品编码、名称、价格、数量) * * @param goods 商品 */voidaddGoods(Goods goods);/** * 商品展示 */voidshowGoods();/** 商品入库(输入商品编号,然后提示用户输入入库数量,进行入库) * @param id 商品编号 */voidinGoods(String id);/** * 商品出库(输入商品编号,提示用户输入出库数量,进行出库) * @param id 商品编号 */voidoutGoods(String id);/** * 修改商品价格(提示用户输入编号,录入新价格) * @param id 商品编号 */voidsetGoodsPrice(String id);/** * 删除商品 * @param id 商品编号 */voiddeleteGoods(String id);}
- 异常类
publicclassExistExcetionextendsException{publicExistExcetion(){}publicExistExcetion(String message){super(message);}}
其他两个一样
实现功能
GoodsDaoImp类实现GoodsDao接口 实现功能
import com.sjtest.Exception.ExistExcetion;import com.sjtest.Exception.NotNumberException;import com.sjtest.dao.GoodsDao;import com.sjtest.pojo.Goods;import com.sjtest.util.DataSourPool;import com.sjtest.util.Util;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import java.util.Scanner;publicclassGoodsDaoImpimplementsGoodsDao{
Scanner scan =newScanner(System.in);//获取接口对象
Connection conn = null;
PreparedStatement ps = null;
ResultSet set = null;@OverridepublicvoidaddGoods(Goods goods){int res =0;
List<Goods> list = Util.AllGoods();//获取所有商品for(Goods goods1 : list){if(goods1.getId().equals(goods.getId())){try{thrownewExistExcetion("已经存在商品");}catch(ExistExcetion existExcetion){
existExcetion.printStackTrace();}}}
String sql =" insert into goods(id,name,price,number) values(?,?,?,?)";
conn = DataSourPool.getConnection();try{
ps = conn.prepareStatement(sql);//获取PreparedStatement 接口对象/*
替换sql中的占位符
*/
ps.setString(1, goods.getId());
ps.setString(2, goods.getName());
ps.setInt(3, goods.getPrice());
ps.setInt(4, goods.getNumber());
res = ps.executeUpdate();//执行sql语句}catch(SQLException throwables){
throwables.printStackTrace();}finally{
DataSourPool.close(conn);
DataSourPool.close(ps);}
System.out.println("添加成功");
System.out.println("添加行数: "+ res +"行");}@OverridepublicvoidshowGoods(){
List<Goods> list = Util.AllGoods();
System.out.println("商品编号\t商品名称\t商品价格\t\t商品数量");for(Goods goods : list){
System.out.println(goods.getId()+"\t\t"+ goods.getName()+"\t\t"+ goods.getPrice()+"\t\t\t"+ goods.getNumber());}}@OverridepublicvoidinGoods(String id){int res =0;
String sql ="update goods set number =? where id=?";try{
conn = DataSourPool.getConnection();//获取连接
ps = conn.prepareStatement(sql);
Goods goods = Util.findIDOutGoods(id);//id对应的商品
System.out.println("商品 "+ goods.getName()+"还有"+ goods.getNumber()+"个");/*
替换占位符
*/
System.out.println("输入想要入库的数量:");int number = scan.nextInt();
number = number + goods.getNumber();
ps.setInt(1, number);
ps.setString(2, id);
res = ps.executeUpdate();
System.out.println("入库成功");
System.out.println("商品 "+ goods.getName()+"还有"+ number +"个");
System.out.println("修改行数: "+ res +"行");}catch(SQLException throwables){
throwables.printStackTrace();}finally{
DataSourPool.close(conn);
DataSourPool.close(ps);}}@OverridepublicvoidoutGoods(String id){int res =0;
String sql ="update goods set number =? where id=?";try{
conn = DataSourPool.getConnection();//获取连接
ps = conn.prepareStatement(sql);
Goods goods = Util.findIDOutGoods(id);//id对应的商品
System.out.println("商品 "+ goods.getName()+"还有"+ goods.getNumber()+"个");/*
替换占位符
*/
System.out.println("输入想要出库的数量:");int numberOut = scan.nextInt();int numberNow = goods.getNumber();//现有的数量if(numberNow > numberOut){
ps.setInt(1, numberNow - numberOut);}else{try{thrownewNotNumberException("库存不够");}catch(NotNumberException e){
e.printStackTrace();}}
ps.setString(2, id);
res = ps.executeUpdate();
System.out.println("出库成功");
System.out.println("商品 "+ goods.getName()+"还有"+(numberNow - numberOut)+"个");
System.out.println("修改行数: "+ res +"行");}catch(SQLException throwables){
throwables.printStackTrace();}finally{
DataSourPool.close(conn);
DataSourPool.close(ps);}}@OverridepublicvoidsetGoodsPrice(String id){int res =0;
String sql ="update goods set price =? where id=?";try{
conn = DataSourPool.getConnection();//获取数据库的连接
ps = conn.prepareStatement(sql);
Goods goods = Util.findIDOutGoods(id);//id对应的商品
System.out.println("商品 "+ goods.getName()+"价格"+ goods.getPrice()+"元");
System.out.println("想要修改的价格:");int priceNew = scan.nextInt();
ps.setInt(1, priceNew);
ps.setString(2, id);
res = ps.executeUpdate();
System.out.println("修改成功");
System.out.println("商品 "+ goods.getName()+"价格"+ priceNew +"元");
System.out.println("修改行数: "+ res +"行");}catch(SQLException throwables){
throwables.printStackTrace();}finally{
DataSourPool.close(ps);
DataSourPool.close(conn);}}@OverridepublicvoiddeleteGoods(String id){int res =0;
String sql ="delete from goods where id=?";try{
conn = DataSourPool.getConnection();//获取数据库的连接
ps = conn.prepareStatement(sql);
Goods goods = Util.findIDOutGoods(id);//id对应的商品
System.out.println(goods);
System.out.println("是否删除 输入1确认 其他键跳过 回车确认");if(scan.nextInt()==1){
ps.setString(1, id);
res = ps.executeUpdate();
System.out.println("删除成功");
System.out.println("修改行数: "+ res +"行");}else{
System.out.println("删除失败");}}catch(SQLException throwables){
throwables.printStackTrace();}finally{
DataSourPool.close(ps);
DataSourPool.close(conn);}}}
每一个功能在下边详细
商品添加
用到了上边的Util类的方法
publicvoidaddGoods(Goods goods){int res =0;//记录修改数据库的行数/*
判断商品是否已存在
*/
List<Goods> list = Util.AllGoods();//获取所有商品for(Goods goods1 : list){if(goods1.getId().equals(goods.getId())){try{thrownewExistExcetion("已经存在商品");//自定义的异常类}catch(ExistExcetion existExcetion){
existExcetion.printStackTrace();}}}
String sql =" insert into goods(id,name,price,number) values(?,?,?,?)";
Connection conn = DataSourPool.getConnection();//获取数据库的连接
PreparedStatement ps = null;// 创建PreparedStatement 接口对象try{
ps = conn.prepareStatement(sql);//获取PreparedStatement 接口对象/*
替换sql中的占位符
*/
ps.setString(1, goods.getId());
ps.setString(2, goods.getName());
ps.setInt(3, goods.getPrice());
ps.setInt(4, goods.getNumber());
res = ps.executeUpdate();//执行sql语句}catch(SQLException throwables){
throwables.printStackTrace();}finally{//关闭资源
DataSourPool.close(conn);
DataSourPool.close(ps);}
System.out.println("添加成功");
System.out.println("添加行数: "+ res +"行");}
商品展示
@OverridepublicvoidshowGoods(){
List<Goods> list = Util.AllGoods();
System.out.println("商品编号\t商品名称\t商品价格\t\t商品数量");for(Goods goods : list){
System.out.println(goods.getId()+"\t\t"+ goods.getName()+"\t\t"+ goods.getPrice()+"\t\t\t"+ goods.getNumber());}}
商品入库
publicvoidinGoods(String id){int res =0;
String sql ="update goods set number =? where id=?";try{
Connection conn = DataSourPool.getConnection();//获取数据库连接
PreparedStatement ps = conn.prepareStatement(sql);//获取PreparedStatement 接口对象
Goods goods = Util.findIDOutGoods(id);//id对应的商品
System.out.println("商品 "+ goods.getName()+"还有"+ goods.getNumber()+"个");/*
替换占位符
*/
System.out.println("输入想要入库的数量:");int number = scan.nextInt();
number = number + goods.getNumber();
ps.setInt(1, number);
ps.setString(2, id);
res = ps.executeUpdate();
System.out.println("入库成功");
System.out.println("商品 "+ goods.getName()+"还有"+ number +"个");
System.out.println("修改行数: "+ res +"行");}catch(SQLException throwables){
throwables.printStackTrace();}finally{
DataSourPool.close(conn);
DataSourPool.close(ps);}}
商品出库
publicvoidoutGoods(String id){int res =0;
String sql ="update goods set number =? where id=?";try{
Connection conn = DataSourPool.getConnection();//获取数据库连接
PreparedStatement ps = conn.prepareStatement(sql);//获取PreparedStatement 接口对象
Goods goods = Util.findIDOutGoods(id);//id对应的商品
System.out.println("商品 "+ goods.getName()+"还有"+ goods.getNumber()+"个");/*
替换占位符
*/
System.out.println("输入想要出库的数量:");int numberOut = scan.nextInt();int numberNow = goods.getNumber();//现有的数量if(numberNow > numberOut){
ps.setInt(1, numberNow - numberOut);}else{try{thrownewNotNumberException("库存不够");}catch(NotNumberException e){
e.printStackTrace();}}
ps.setString(2, id);
res = ps.executeUpdate();
System.out.println("出库成功");
System.out.println("商品 "+ goods.getName()+"还有"+(numberNow - numberOut)+"个");
System.out.println("修改行数: "+ res +"行");}catch(SQLException throwables){
throwables.printStackTrace();}finally{
DataSourPool.close(conn);
DataSourPool.close(ps);}}
商品修改价格
publicvoidsetGoodsPrice(String id){int res =0;
String sql ="update goods set price =? where id=?";try{
Connection conn = DataSourPool.getConnection();//获取数据库的连接
PreparedStatement ps = conn.prepareStatement(sql);//获取PreparedStatement 接口对象
Goods goods = Util.findIDOutGoods(id);//id对应的商品
System.out.println("商品 "+ goods.getName()+"价格"+ goods.getPrice()+"元");
System.out.println("想要修改的价格:");int priceNew = scan.nextInt();
ps.setInt(1, priceNew);
ps.setString(2, id);
res = ps.executeUpdate();
System.out.println("修改成功");
System.out.println("商品 "+ goods.getName()+"价格"+ priceNew +"元");
System.out.println("修改行数: "+ res +"行");}catch(SQLException throwables){
throwables.printStackTrace();}finally{
DataSourPool.close(ps);
DataSourPool.close(conn);}}
商品删除
publicvoiddeleteGoods(String id){int res =0;
String sql ="delete from goods where id=?";try{
Connection conn = DataSourPool.getConnection();//获取数据库的连接
PreparedStatement ps = conn.prepareStatement(sql);//获取PreparedStatement 接口对象
Goods goods = Util.findIDOutGoods(id);//id对应的商品
System.out.println(goods);
System.out.println("是否删除 输入1确认 其他键跳过 回车确认");if(scan.nextInt()==1){
ps.setString(1, id);
res = ps.executeUpdate();
System.out.println("删除成功");
System.out.println("修改行数: "+ res +"行");}else{
System.out.println("删除失败");}}catch(SQLException throwables){
throwables.printStackTrace();}finally{
DataSourPool.close(ps);
DataSourPool.close(conn);}}
Demo 类测试类
import com.sjtest.dao.imp.GoodsDaoImp;import com.sjtest.pojo.Goods;import com.sjtest.util.Util;import java.util.Scanner;/**
* 项目要求:
* 1.能根据项目需求设计合理的实体类
* 2.规范的编码
* 3.合理选择集合类型
* 4.关闭程序后,录入的数据下次打开程序还存在
* 商品添加(输入商品编码、名称、价格、数量)
* 商品列表展示
* 商品入库(输入商品编号,然后提示用户输入入库数量,进行入库)
* 商品出库(输入商品编号,提示用户输入出库数量,进行出库)
* 修改商品价格(提示用户输入编号,录入新价格)。
* 删除商品
*/publicclassDemo{publicstaticvoidmain(String[] args){
Scanner scan =newScanner(System.in);
GoodsDaoImp goodsManager =newGoodsDaoImp();while(true){
System.out.println("-------------------");
System.out.println("欢迎来到商品管理后台");
System.out.println("选择你的操作:");
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("7.退出");
System.out.println("-------------------");switch(scan.nextInt()){case1:
System.out.println("依次输入 商品编码、名称、价格、数量");
Goods goods =newGoods(scan.next(), scan.next(), scan.nextInt(), scan.nextInt());
goodsManager.addGoods(goods);break;case2:
goodsManager.showGoods();break;case3://获取商品编号
Util.showIDAndName();
System.out.println("请输入商品编号:");
goodsManager.inGoods(scan.next());break;case4://获取商品编号
Util.showIDAndName();
System.out.println("请输入商品编号:");
goodsManager.outGoods(scan.next());break;case5://获取商品编号
Util.showIDAndName();
System.out.println("请输入商品编号:");
goodsManager.setGoodsPrice(scan.next());break;case6://获取商品编号
Util.showIDAndName();
System.out.println("请输入商品编号:");
goodsManager.deleteGoods(scan.next());case7:
System.exit(0);break;default:
System.out.println("输入错误");break;}}}}
项目到这里结束了,有更好的建议欢迎评论,指正。
源码点击这里
本文转载自: https://blog.csdn.net/m0_55916987/article/details/123398284
版权归原作者 阿杰么 所有, 如有侵权,请联系我们删除。
版权归原作者 阿杰么 所有, 如有侵权,请联系我们删除。