一.概述

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. JS 判断移动端 ,跳转

    function SetPlatForm() { var JumpUrl = ""; var sUserAgent = navigator.userAgent.toLowerCas ...

  2. 函数式编程 -> Lambda

    一.函数式编程 函数式编程,同面向对象编程.指令式编程一样,是一种软件编程范式,在多种编程语言中都有应用.百科词条中有很学术化的解释,但理解起来并不容易.不过,我们可以借助于数学中函数的概念,来理解函 ...

  3. this的绑定(四种绑定)+ 箭头函数 的this

    一.this的默认绑定 当一个函数没有明确的调用对象的时候,也就是单纯作为独立函数调用的时候,将对函数的this使用默认绑定:绑定到全局的window对象 例子1: function foo(){ c ...

  4. django基础之day04知识点----查询相关

    from django.test import TestCase # Create your tests here. ''' 当你想单独测试django中某一个py文件时,你需要手动配置测试文件 在m ...

  5. CouchDB学习一

    端口 端口号 协议 作用 5984 tcp 标椎集群端口用于所有的HTTP API请求 5986 tcp 用于管理员对节点与分片的管理 4369 tcp Erlang端口到daemon的映射 配置介绍 ...

  6. Spring IoC容器与应用上下文的设计与实现

    一.前言 写这篇博文的主要目的如下: 通过相关类和接口分析IoC容器到底长什么样. 阐述笔者对Spring上下文和容器的理解. 介绍重要的类辅助理解SpringBoot的启动流程. 二.Spring ...

  7. Python面向对象-继承和多态特性

    继承 在面向对象的程序设计中,当我们定义一个class时候,可以从现有的class继承,新的class成为子类,被继承的class称为基类,父类或超类. 比如,编写一个名为Animal的class: ...

  8. oopday02(面向对象-构造方法&静态static)

    面向对象之封装 01_面向对象(构造方法Constructor概述和格式) * A:构造方法概述和作用 * 给对象的数据(属性)进行初始化 * B:构造方法格式特点 * a:方法名与类名相同(大小也要 ...

  9. 利用keras自带路透社数据集进行多分类训练

    import numpy as np from keras.datasets import reuters from keras import layers from keras import mod ...

  10. <科普>CPU进行四则运算(加减乘除)的主流方法

    以下除特殊说明外均为32位数的运算 1.加法运算 A   +   B    =   C 无符号整数加法和有符号整数加法均采用以下方案进行操作 用到的寄存器与初始化内容: 32位加数寄存器------- ...