项目技术要点:
- 数据库操作🌟🌟
- 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);
三、数据库连接池、工具类库准备
本小节主要是准备C3P0和DBUtils,下载配置方式可参考此文第3.2部分和第4部分
⚠️注意:c3p0-config.xml文件需要放在工程src根目录下面
四、工程目录结构
五、详细代码说明
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();
}
}
}
六、测试代码
登录:
商品列表页:
增加商品:
删除商品:
修改商品:
页面返回:
系统退出: