Java小项目(一)超市管理系统

625 阅读4分钟

项目技术要点:

  • 数据库操作🌟🌟
  • C3P0🌟
  • MVC模式🌟🌟
  • DBUtils🌟
  • 接口实现与结构🌟🌟

一、需求分析

  • 货物清单展示的能力
  • 增加/删除货物的能力
  • 修改货物信息的能力
  • 货物信息包含:编号、单价、商品名
  • 登录系统,需要输入正确的用户名和密码
  • 可在子页面按键返回主菜单页面
  • 退出后,整个系统退出

二、数据库表准备

CREATE TABLE goods( 
    id INT PRIMARY KEY AUTO_INCREMENT, 
    goodsid int NOT NULL, 
    price double NOT NULL, 
    name varchar(20) NOT NULL);
image.png

三、数据库连接池、工具类库准备

本小节主要是准备C3P0和DBUtils,下载配置方式可参考此文第3.2部分和第4部分

⚠️注意:c3p0-config.xml文件需要放在工程src根目录下面

四、工程目录结构

image.png

五、详细代码说明

1、主工程代码

package ShopSystem.test;

import ShopSystem.utils.MenuBack;
import ShopSystem.view.*;

import java.util.Scanner;

/**
 * 程序入口
 */
public class Supermarket {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean isWork = true;

        // 1 需要登录
        LoginPage.login(scanner);

        // 2 登录成功后显示主页面
        MainPage.menu();
        while (isWork) {
            // 3 接收用户输入,看选择的什么功能
            int indexChoose;
            System.out.println("请选择功能编号:");
            indexChoose = scanner.nextInt();
            if (indexChoose == 1) {
                // 3.1 展示商品列表
                GoodsListPage.goodsList();
                MenuBack.back();
            } else if (indexChoose == 2) {
                // 3.2 增加商品
                GoodsAddPage.goodAdd();
                MenuBack.back();
            } else if (indexChoose == 3) {
                // 3.3 删除商品
                GoodsDeletePage.goodDelete();
                MenuBack.back();
            } else if (indexChoose == 4) {
                // 3.4 修改商品
                GoodsModifyPage.goodModify();
                MenuBack.back();
            } else if (indexChoose == 5) {
                isWork = false;
            } else {
                System.out.println("您输入的选项不对,请重新输入");
            }
        }
    }
}

2、登录验证代码

在登录页面定义了登录方法:

package ShopSystem.view;

import ShopSystem.utils.LoginSuccess;

import java.util.Scanner;

public class LoginPage {
    public static void login(Scanner scanner) {
        while (true) {
            System.out.println("请输入您的账号:");
            String username = scanner.nextLine().trim();
            System.out.println("请输入您的密码:");
            String password = scanner.nextLine().trim();
            // 校验账号密码是否正确
            if (LoginSuccess.loginSuccess(username, password)) {
                break;
            }
        }
    }
}

这里调用了工具类里的验证登录是否成功的方法:

package ShopSystem.utils;

public class LoginSuccess {

    public static boolean loginSuccess(String username, String password){
        if ("admin".equals(username) && "admin".equals(password)){
            System.out.println("登录成功!欢迎使用超市管理系统 ^_^");
            return true;
        } else {
            System.out.println("用户名或密码错误,请重新输入");
            return false;
        }
    }
}

3、主页面代码

登录成功后即可显示主页面菜单:

package ShopSystem.view;

/**
 * 商品管理系统-菜单页面
 */
public class MainPage {
    public static void menu(){
        System.out.println("===============超市商品管理系统===============");
        System.out.println("1、商品清单列表");
        System.out.println("2、增加商品");
        System.out.println("3、删除商品");
        System.out.println("4、修改商品");
        System.out.println("5、退出管理系统");
    }
}

4、展示商品列表

调用商品列表页面的展示方法:

package ShopSystem.view;

import ShopSystem.entity.Good;
import ShopSystem.service.good.impl.GoodServiceImpl;

import java.util.List;

public class GoodsListPage {

    public static void goodsList() {
        System.out.println("===============管理列表===============");
        System.out.println("商品编号\t\t单价\t\t\t商品名称");

        // 这里调用查询商品的方法
        GoodServiceImpl goodServiceImpl = new GoodServiceImpl();
        List<Good> goodList = goodServiceImpl.selectGoods();

        for (Good good : goodList) {
            System.out.println(good.getGoodsId() + "\t\t" + good.getPrice() + "\t\t" + good.getName());
        }
    }
}

5、增加商品

package ShopSystem.view;

import ShopSystem.entity.Good;
import ShopSystem.service.good.impl.GoodServiceImpl;

import java.util.Scanner;

public class GoodsAddPage {

    public static void goodAdd() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("===============增加商品===============");
        System.out.println("请输入商品编号ID:");
        int goodsId = Integer.parseInt(scanner.nextLine());
        System.out.println("请输入商品单价:");
        double price = Double.parseDouble(scanner.nextLine());
        System.out.println("请输入商品名称:");
        String name = scanner.nextLine();

        Good good = new Good(goodsId, price, name);
        // 这里调用添加商品的方法
        GoodServiceImpl goodServiceImpl = new GoodServiceImpl();
        goodServiceImpl.addGood(good);
    }
}

6、删除商品

package ShopSystem.view;

import ShopSystem.service.good.impl.GoodServiceImpl;

import java.util.Scanner;

public class GoodsDeletePage {

    public static void goodDelete(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("===============删除商品===============");
        System.out.println("请输入要删除的商品编号ID:");
        int goodsId = Integer.parseInt(scanner.nextLine());

        // 这里调用删除商品的方法
        GoodServiceImpl goodServiceImpl = new GoodServiceImpl();
        goodServiceImpl.deleteGood(goodsId);
    }
}

7、修改商品

package ShopSystem.view;

import ShopSystem.service.good.impl.GoodServiceImpl;

import java.util.Scanner;

public class GoodsDeletePage {

    public static void goodDelete(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("===============删除商品===============");
        System.out.println("请输入要删除的商品编号ID:");
        int goodsId = Integer.parseInt(scanner.nextLine());

        // 这里调用删除商品的方法
        GoodServiceImpl goodServiceImpl = new GoodServiceImpl();
        goodServiceImpl.deleteGood(goodsId);
    }
}

8、service代码

实际业务处理掉的是这里的代码

GoodService接口定义了增、删、改、查商品的四种方法,同Dao层保持一致

package ShopSystem.service.good;

import ShopSystem.entity.Good;

import java.util.List;

public interface GoodService {
    List<Good> selectGoods();

    void addGood(Good good);

    void deleteGood(int goodsId);

    void modifyGood(Good good);
}
package ShopSystem.service.good.impl;

import ShopSystem.dao.good.impl.GoodDaoImpl;
import ShopSystem.entity.Good;
import ShopSystem.service.good.GoodService;

import java.util.List;

public class GoodServiceImpl implements GoodService {
    GoodDaoImpl goodDaoImpl = new GoodDaoImpl();

    @Override
    public List<Good> selectGoods() {
        List<Good> goodList = goodDaoImpl.selectGoods();
        return goodList;
    }

    @Override
    public void addGood(Good good) {
        goodDaoImpl.addGood(good);
    }

    @Override
    public void deleteGood(int goodsId) {
        goodDaoImpl.deleteGood(goodsId);
    }

    @Override
    public void modifyGood(Good good) {
        goodDaoImpl.modifyGood(good);
    }
}

9、Dao层代码

实际与数据库相关、操作数据的是Dao层定义和实现的

package ShopSystem.dao.good;

import ShopSystem.entity.Good;

import java.util.List;

public interface GoodDao {
    List<Good> selectGoods();

    void addGood(Good good);

    void deleteGood(int goodsId);

    void modifyGood(Good good);
}

⚠️ 下面的是数据库操作方法,核心:

package ShopSystem.dao.good.impl;

import ShopSystem.dao.good.GoodDao;
import ShopSystem.entity.Good;
import ShopSystem.utils.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class GoodDaoImpl implements GoodDao {

    @Override
    public List<Good> selectGoods() {
        List<Good> goodsResult = null;
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        try {
            goodsResult = queryRunner.query("select * from goods", new ResultSetHandler<List<Good>>() {
                @Override
                public List<Good> handle(ResultSet resultSet) throws SQLException {
                    List<Good> goods = new ArrayList<>();
                    while (resultSet.next()) {
                        Good good = new Good();
                        good.setGoodsId(resultSet.getInt("goodsid"));
                        good.setPrice(resultSet.getDouble("price"));
                        good.setName(resultSet.getString("name"));
                        goods.add(good);
                    }
                    return goods;
                }
            });
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return goodsResult;
    }

    @Override
    public void addGood(Good good) {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        try {
            queryRunner.update("insert into goods values(null, ?, ?, ?)",
                    good.getGoodsId(), good.getPrice(), good.getName());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    @Override
    public void deleteGood(int goodsId) {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        try {
            queryRunner.update("delete from goods where goodsid=?", goodsId);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    @Override
    public void modifyGood(Good good) {
        QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
        try {
            queryRunner.update("update goods set price=?,name=? where goodsid=?",
                    good.getPrice(), good.getName(), good.getGoodsId());
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

10、菜单返回功能

定义成一个工具类方法:

package ShopSystem.utils;

import ShopSystem.view.MainPage;

import java.util.Scanner;

public class MenuBack {

    public static void back() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("[按q键返回上一层]");
        String back = scanner.nextLine();
        if ("q".equals(back) || "Q".equals(back)) {
            MainPage.menu();
        } else {
            back();
        }
    }
}

六、测试代码

登录:

image.png

商品列表页:

image.png

增加商品:

image.png

删除商品:

image.png

修改商品:

image.png

页面返回:

image.png

系统退出:

image.png