一.概述

1.鹏哥前面有写过java项目超市管理系统项目,传送门

2.收到很多朋友私信给我,也很感谢老铁们的反馈和交流,前面这个项目只是对java基础知识和面向对象的思想练习,但是没有涉及到java如何操作数据库,如何通过java将数据从数据库拿出来,如果存进去这些问题。对于java新手来说,这些问题不知道从何处下手。有很多刚入门的java新手建议我写个java操作数据库的实战项目供入门者参考,我想如果能帮助他们少花点时间出坑,何乐不为?鹏哥就特意思考了一天,整理了一下思路,今天就抽时间写个超市购物管理系统.....go go go

3.超市购物管理系统涉及到的知识:java基础语法,java面向对象的开发思想,java如何操作数据库,集合方面的知识

4.适合java入门,不知道java如何操作数据库

5.基本所有的代码鹏哥会打上注释,方便阅读

6.因为是java操作数据库的实战项目,不会详细讲解java环境搭建,数据库安装,sql语法这些知识。太多了,我写一周不见得写完.....或者可以去鹏哥站 java一号 查看相关文章。所以开始之前你总的把java开发环境安装好吧、数据库安装好吧、

7.开发工具eclipse;jdk是1.8;数据库用的是mysql5.5 (当然sqlserver数据库完全可以)

8.源码获取:我会将核心代码粘贴出来,所有的代码关注鹏哥公众号  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一号  有需要的自提

不是在搬砖,就是搬砖的路上,希望你的程序永无bug

java超市购物管理系统的更多相关文章

  1. Java学习笔记7(简易的超市库存管理系统示例)

    用以前学过的知识,可以简单地做一个超市库存管理系统: 定义一个商品类: public class FruitItem { int ID; String name; double price; int ...

  2. 编写Java程序_连锁超市购物结算系统

    目录 功能需求: 一.Use Case 1 显示商品信息列表: 二.Use Case 2 输入购买商品编号 三.Use Case 3 显示购物结算清单 需求分级: 实现代码: 功能需求: Soft f ...

  3. Java初学者作业——为某超市设计管理系统,需要在控制台展示系统菜单,菜单之间可以完成跳转。

    返回本章节 返回作业目录 需求说明: 为某超市设计管理系统,需要在控制台展示系统菜单,菜单之间可以完成跳转. 实现思路: 定义mainMenu方法,用于显示主菜单. 主菜单主要负责显示4个选项,分别是 ...

  4. RFID射频卡超市购物结算系统

    RFID射频卡超市购物结算系统 这段时间在做RFID射频卡超市购物结算系统,这个系统的设想来自于大学研究课题,但是我们在淘宝网上购买设备的时候淘宝店主都认为RF射频技术不好应用在超市购物结算系统,原因 ...

  5. 项目一:ssm超市订单管理系统

    声明:项目参考于课程教材,学习使用,仅在此记录 项目介绍 ssm超市订单管理系统,功能模块有订单管理,供应商管理,用户管理,密码修改,退出系统,管理模块中包括基本的增删改查 集成工具使用idea,基于 ...

  6. 使用switch编写一个购物管理系统

    在编写过程中,可能没有做到语句的精简,这个是需要解决的事. package nzcc4; import java.util.Scanner; public class Shopmain { publi ...

  7. 基于Spring MVC + Spring + MyBatis的【超市会员管理系统】

    资源下载: https://download.csdn.net/download/weixin_44893902/22035329 一. 语言和环境 实现语言:JAVA语言. 使用:MyEclipse ...

  8. smdms超市订单管理系统之登录功能

    一.超市订单管理系统准备阶段 Supermarket order management system 创建数据库 数据库代码放置如下 点击查看数据库address代码 CREATE TABLE `sm ...

  9. 美萍超市销售管理系统标准版access数据库密码mp611

    美萍超市销售管理系统标准版access数据库密码mp611 作者:admin  来源:本站  发表时间:2015-10-14 19:01:43  点击:199 美萍超市销售管理系统标准版access后 ...

随机推荐

  1. WebSocket重连实现

    方式一.使用第三方库实现 比如:reconnecting-websocket.jsReconnectingWebSocket,代码:https://github.com/joewalnes/recon ...

  2. Caffe源码-InsertSplits()函数

    InsertSplits()函数 在Net初始化的过程中,存在一个特殊的修改网络结构的操作,那就是当某层的输出blob对应多个其他层的输入blob时,会在输出blob所在层的后面插入一个新的Split ...

  3. Ngnix:最通俗解读,Nginx是什么

    Nginx 同 Apache 一样都是一种 Web 服务器.基于 REST 架构风格,以统一资源描述符(Uniform Resources Identifier)URI 或者统一资源定位符(Unifo ...

  4. WPF布局容器

    1.StackPanel:堆栈面板,通过Orientation属性设置子元素的布局排列方向为“Vertical”(垂直)和“Horizontal”(水平),不写其默认值为“Vertical”,当设置为 ...

  5. onTouchEvent中,跟随手指滑动的view出现抖动

    在这次实践中,它抖动得不正常,太不正常,太抖. 其实是我代码上出现了问题,记录一下. 我是怎么设置滑动的呢? 通过改变view的margin. 然而我在onTouchEvent中怎么控制它滑动的大小呢 ...

  6. sessionstorage中存储JSON数据

    在web开发时,可能经常会用到sessionstorage存储数据,存储单个字符串数据变量时并不困难 var str = 'This is a string'; sessionstorage.setI ...

  7. Pikachu-Sql Inject

    Pikachu-Sql Inject 在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞. 一个严重的SQL注入漏洞,可能会直接导致一 ...

  8. numpy的基本API(四)——拼接、拆分、添加、删除

    numpy的基本拼接.拆分.添加.删除API iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.np.concatenate((a, b), axis=0) ...

  9. 使用 ASP.NET Core MVC 创建 Web API(六)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  10. puppeteer开发

    Chromium下载问题 https://github.com/GoogleChrome/puppeteer/ https://download-chromium.appspot.com/?platf ...