一.概述
1.项目基于超市购物场景,通过java+mysql数据库模拟一个简单超市购物管理系统
2.超市购物管理系统涉及到的知识:java基础语法,java面向对象的开发思想,java如何操作数据库,集合方面的知识
3.适合java入门,不知道java如何操作数据库
4.基本所有的代码会打上注释,方便阅读
5.因为是java操作数据库的实战项目,不会详细讲解java环境搭建,数据库安装,sql语法这些知识。开始之前你总的把java开发环境安装好吧、数据库安装好吧、
6.开发工具eclipse;jdk是1.8;数据库用的是mysql5.5 (当然sqlserver数据库完全可以)
7.源码获取:我会将核心代码粘贴出来,所有的代码关注鹏哥公众号 程序三两行 项目中会给出
二:效果演示
=================欢迎使用超市购物管理系统=================
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 系统主界面
*/
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("编号 "+"名称 "+"单价 "+"数量 ");
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 (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("编号 "+"名称 "+"数量 "+"总价");
//lambda表达式遍历集合,当然是用for循环也ok
goods.forEach(in->System.out.println(in.getId()+" "+in.getName()+
" "+in.getNum()+" "+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操作数据库而言可以参考,
源码我放在了公众号 程序三两行 有需要的自提