☰
JavaWeb老项目实战:Eclipse+MySQL运行超市管理系统全解析
2026/10/9 6:09:45 网站建设 项目流程

简介:系统面向超市日常运营管理场景,基于Eclipse与MySQL实现商品进销存、采购管理、销售收银及数据统计,并提供管理员与收银员双角色界面,适合Java学习者、毕业设计使用者及中小型超市信息化改造参考。压缩包为zip格式,共378个文件,包含49个java源文件、56个jsp页面、98个class编译文件、8个jar依赖包、1个sql数据库脚本以及css/js/png等前端资源,整体大小约10.37MB,目录结构完整,便于导入开发环境后直接运行与二次开发。已有2384人学习下载。资源涵盖了商品销售、采购、供应商管理、数据报表等核心模块,附带了项目依赖与配置信息,可帮助读者理解Java Web项目分层开发思路、数据库表设计及角色权限控制方法,是一份具有实操参考价值的完整项目源码。

1. 拿下一套 java 超市管理系统:Eclipse + MySQL 到底能不能直接跑

做课设或者接手别人源码的时候,最头疼的就是这个:项目文件给你摆得整整齐齐,一导入 Eclipse 就满天飞红叉,跑起来更是玄学。这套 java 超市管理系统就是典型的 Servlet + JSP + JavaBean 老三层结构,作者名单里能看到 ProductDaoImpl、VipDaoImpl、ProviderDaoImpl、CheckoutServlet 这些类名,说明进销存、会员、供应商、结账这些核心模块全都齐了,不是那种只有登录注册的演示品。这套东西用的是最传统的 JSP + DAO 模式,没有 Spring、没有 Maven,对刚学完 JavaWeb 的人来说反而好拆——每一个文件你都能看懂它干嘛的,每一行 SQL 都能在 MySQL 里单独跑通。适合两类人:一是做课程设计或毕业设计需要一套能讲清楚原理的完整系统,二是工作里需要快速理解早期 JavaWeb 项目怎么组织代码的。这篇笔记就按我实际折腾这套源码的顺序写,把它怎么分层、怎么连库、先在哪个文件里改参数、踩过哪些坑一次说透。

2. 一个超市系统被拆成几块:从 DAO 到 Servlet 的分层逻辑

拿到这套源码先别急着双击运行,得先看懂它的包结构。你打开 Eclipse 的 Package Explorer 扫一眼,会发现类名非常有规律:UserDaoImpl 管登录用户,ProductDaoImpl 管商品,VipDaoImpl 管会员,ProviderDaoImpl 管供应商,CheckoutServlet 管前台结账。这个命名习惯属于十年前的 JavaWeb 标准姿势——一个实体类对应一个 Dao 接口、一个 DaoImpl 实现类、一个 Servlet 控制层,再配一个 JSP 页面做展示。

我一般在拆解这种项目时先画一条请求路径:用户在 JSP 页面上点按钮,表单提交到 Servlet,Servlet 调 DaoImpl 的方法,DaoImpl 里写 SQL 操作 MySQL 数据库。这就是最朴素的三层结构——表现层(JSP)、控制层(Servlet)、数据访问层(DAO),业务逻辑直接写在 Servlet 里,没有独立的 Service 层。很多课设源码都是这种写法,因为好讲也好懂。

项目名称中的“超市管理系统”,对应到数据库里就是这几张核心表:商品表(product)、供应商表(provider)、会员表(vip)、用户表(user)、进货表(purchase)、销售表(checkout)。代码里的每个 DaoImpl 就是围绕第一张表做增删改查。你把这个映射关系弄清楚了,改任何功能都能顺着表层找到修改点。

2.1 从 DaoImpl 入手:先搞懂一个类要写哪些方法

打开 ProductDaoImpl 你会看到它的骨架:add、delete、update、findById、findAll,外加一个条件查询。这是标准的 DAO 模板,方法名跟 SQL 操作一一对应。比如说 findById 的实现就是一个查询模板,把结果集放进 Product 对象里返回,核心可不就是把SELECT * FROM product WHERE id = ?这段 SQL 写对。参数绑定用的是 PreparedStatement 的占位符方式,先给 SQL 打问号,再一个个setString、setInt,这样能避免拼接 SQL 带来的注入问题。这套源码里 DAO 层普遍是手写 SQL,没有用 DBUtils,对初学者反而是好事——能看清 JDBC 每一步在干什么。

每个 DaoImpl 顶部都会引入 DBUtil 这个工具类,负责拿数据库连接。这里的连接参数就是你后面导入 Eclipse 后一定要改的第一个地方。

// DBUtil.java 典型写法 package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static String url = "jdbc:mysql://localhost:3306/supermarket?useUnicode=true&characterEncoding=utf-8"; private static String user = "root"; private static String password = "123456"; static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } }

这段代码的逻辑顺序是:先声明三个连接属性,url指数据库地址和表名,user和password是 MySQL 账号。然后静态代码块注册 JDBC 驱动,最后getConnection统一创建连接,这样其它 DaoImpl 不用重复写驱动加载。参数方面,localhost:3306是本地默认端口,你如果改成别的端口或者 MySQL 装在别的机器上,只改这一行就可以。

2.2 下单和结账的流转:CheckoutServlet 是链路最长的请求

这套系统里 CheckoutServlet 在类名上重复出现了两次,在源码里对应急着结账功能的前后台入口。它的请求路径大致是这样:收银员在 checkout.jsp 里输入商品编号和数量,表单提交后,CheckoutServlet 接收参数,调用 ProductDaoImpl 查商品价格,再调用 VipDaoImpl 查会员折扣,算完总价后往销售表写记录,同时修改商品表的库存字段。这一串逻辑很短,但是把超市系统的核心业务串起来了——收银动作不只是记一笔账,还要同时扣库存。

具体实现时一般会走这个流程:第一步校验商品编号是否存在;第二步判断是不是会员,是就打折扣价;第三步算应收金额;第四步开启事务,先写 sale 表再更新 product 表。因为牵扯两张表的写入,事务是必须的,否则卖出一件商品后库存没减,账就对不上了。你可以从这段代码入手去理解超市业务里“交易”这个概念,而不是只做一个简单的单表 CRUD。

如果你要在答辩时讲清楚这套系统的价值,结账事务这段是最好的切入点——它证明这不是纯粹的增删改查,而是考虑了数据一致性。

2.3 数据统计模块:它是怎么算出销售排行和毛利的

摘要描述里特别提了数据统计是亮点,能出销售排行、库存预警、毛利润分析。这在课设级别的系统里算加分的模块。代码实现上通常就是一条带聚合函数的 SQL,比如统计销售排行:

SELECT p.name AS 商品名, SUM(c.quantity) AS 销量, SUM(c.total_price) AS 销售额 FROM checkout_detail c LEFT JOIN product p ON c.product_id = p.id GROUP BY p.name ORDER BY 销售额 DESC LIMIT 10;

这条 SQL 的逻辑是先把销售明细表和商品表关联起来,然后按商品名分组,用 SUM 把同一商品的销量和销售额加总,最后按销售额从高到低排。参数方面,LIMIT 10 控制只显示前十个,你要改成前二十个就换数字。库存预警的 SQL 更简单,一条SELECT name FROM product WHERE stock < 20就能把低库存商品捞出来。毛利分析的实现思路是把销售额减去进货价乘以销量,核心就是 SQL 里的减法表达式。

3. 把源码导入 Eclipse:从 JDK 选型到环境配置一次过

很多人卡在这一步。源码没问题,但环境配不对,Eclipse 里永远是一片红叉。这套系统是标准的 JavaWeb 老项目,我需要说明的是现在新装 Eclipse 的人容易踩两个雷:一是装了最新版 Eclipse 默认不带 Web 开发插件,二是不清楚这个项目该用 JDK 8 还是 JDK 17。这两种情况都会导致导入后项目直接编译不了。

先说我的建议组合,按这套源码的兼容性来排:JDK 8 + Eclipse 2022-06 或 2020-12 版本 + Tomcat 8.5 + MySQL 5.7。JDK 8 是老 JavaWeb 项目的基线,javax.servlet 全家桶在 JDK 8 下没有任何问题。Tomcat 8.5 支持 Servlet 3.1,跟 javax.servlet 命名空间完全对口。MySQL 5.7 跟源码里的驱动也最匹配。

3.1 Eclipse 版本选择:装带 WTP 的发行版最省事

Eclipse 官网下载页有个 “Eclipse IDE for Enterprise Java and Web Developers” 的发行版,自带 WTP 插件,创建和导入 Web 项目不用额外装东西。如果你已经装了纯 Java 版 Eclipse,可以走 Help > Install New Software 搜 “Web Tools Platform” 补装,但比较慢,我一般直接重下一个企业版省事。

项目导入时有一个关键选项要知道:File > Import > General > Existing Projects into Workspace,选到项目根目录后勾选 Search for nested projects,把嵌套项目也识别进来。很多系统拆成两个工程,一个放前端 JSP,一个放后端 Java,漏了嵌套扫描会导致导进去只有一半代码。

导入完成后,右键项目看 Properties > Project Facets,确认 Dynamic Web Module 前面打勾且版本不低于 3.0。如果没勾,Servlet 就不会被编译进 web.xml 的映射里,启动后访问全 404。

3.2 Tomcat 配置:这一步错了启动必报 404

项目导入后需要在 Servers 视图里新建一个 Tomcat 8.5 的服务器实例。注意,不是把源码里的 tomcat 文件夹拷进去,而是用 Eclipse 内置的 Server 功能指向你本地的 Tomcat 安装目录。创建好之后,右键这个 Server 选 Add and Remove,把超市管理系统从左侧移到右侧已配置列表里。

常犯的错误是 Web 项目根本没添加到 Server,只启动了一个空的 Tomcat,页面自然打不开。还有一种是 Server Locations 选了 Use workspace metadata,导致部署路径跟项目真实路径不一致,改 JSP 后页面不刷新。我一般用默认的 Use Tomcat installation 选项,改完代码直接 Ctrl+S 然后重启 server 就能生效。启动时看 Console 日志,出现 “Server startup in xxx ms” 就说明 Tomcat 起来了,再在浏览器地址栏输入http://localhost:8080/项目名就能访问登录页。项目名在 web.xml 里配置,也可以在 Properties > Web Project Settings 里改 Context Root。

4. 数据库初始化和连接参数:先把 MySQL 里的表建出来

源码包一般会带一个 SQL 文件,叫 supermarket.sql 或者 init.sql,这个文件是整个系统能不能跑起来的关键。你要做的不是打开看一眼,而是把它完整执行到 MySQL 里。执行方式有两种:一种是命令行输入source E:/path/supermarket.sql,另一种是 Navicat 里右键数据库选运行 SQL 文件。我更推荐命令行方式,报错信息更直接,不会因为图形工具字符集问题导致乱码。

如果没有自带 SQL 文件,你需要手动建库:CREATE DATABASE supermarket DEFAULT CHARACTER SET utf8;,然后根据 DaoImpl 里的字段名把表结构凑齐。注意 CREATE DATABASE 时一定要指定 utf8 字符集,否则后面插入中文商品名全变成问号。这是老项目最常见的乱码根源之一。

4.1 修改 DBUtil 里的连接参数:root 密码和库名

源码默认的数据库配置一般是 root 账号、密码 123456、库名 supermarket。如果你的 MySQL 密码不是 123456,把 DBUtil 里的 password 改成你自己的,其它不用动。如果建库时起了别的名字,jdbc:mysql://localhost:3306/后面的库名也要同步改。这一步就是全局搜索 “root” 或 “123456” 两个关键词,凡是出现在 Java 代码里的都要替换。我遇到过源码里不止一个 DBUtil,在不同包下各放了一个,每个都要改,不要只改一个就急着启动。

有一种坑叫“驱动找不到”:项目里 lib 文件夹没引入 mysql-connector-java.jar。eclipse 里找到项目右键 Build Path > Configure Build Path > Libraries > Add JARs,把 jar 加进依赖。没有这个 jar,运行时会报 ClassNotFoundException,不是 SQL 错误。

4.2 MySQL 5.7 与驱动版本的匹配关系

这套代码大概率是用 5.x 驱动写的,驱动类名是com.mysql.jdbc.Driver。如果你用的是 MySQL 8.0 以上,这个老驱动直接抛异常,驱动类名要换com.mysql.cj.jdbc.Driver,连接串还要额外加serverTimezone=Asia/Shanghai之类的时区参。这就是为什么我一再强调用 5.7——不只是稳定,还省掉改代码的麻烦。如果你执意用 MySQL 8,需要同时改三处:驱动类名、url 加时区参数、jar 包换成 mysql-connector-java 8.x 版本。

4.3 防止中文乱码:连接串和数据库两处一起设

乱码是绕不过去的问题。我处理过很多次这套系统的乱码,总结下来两处必须同时设置:一是在建库时指定 utf8,二是在 JDBC 连接串里加useUnicode=true&characterEncoding=utf-8。这两处少了任何一处,入库的中文都会变成问号,页面取出来也显示不了。还有一处容易被忽略,就是 JSP 文件的pageEncoding属性,老项目经常会写 GBK,你可以在 Eclipse 里全量搜索 pageEncoding,统一改成 UTF-8。

5. 常见问题避坑:本地启动这套老项目最容易翻车的四个点

这套源码本身没有太多隐藏难点,真正的坑全在环境和版本匹配上。我按踩过的顺序写四条,每一条都是能直接对号入座的经验。

5.1 现象:Eclipse 启动报 “找不到或无法加载主类 org.apache.catalina.startup.Bootstrap”

原因:这是 Tomcat 没正确关联到项目。很多人以为把 Tomcat 的 jar 包手动加到 Build Path 就能启动,这不对。Bootstrap 类是 Tomcat 自带的启动类,Eclipse 只有在正确配置了 Server Runtime Environment 的情况下才能调起来。

解决:打开 Window > Preferences > Server > Runtime Environments,点 Add 选 Apache Tomcat v8.5,指定 Tomcat 安装路径后完成。然后在 Servers 视图里新建这个运行时,再把系统项目加进去。

5.2 现象:启动时数据库连接报错 “Access denied for user 'root'@'localhost'”

原因:DBUtil 里的密码跟你本机 MySQL root 的密码不是同一个。

解决:先确认 MySQL root 实际密码是什么,在 DBUtil 里把 password 改成对应值。如果你连密码都忘了,用 MySQL 的跳过权限表模式重置:在 my.ini 的 [mysqld] 段加skip-grant-tables,重启 MySQL 后登录执行ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';重置密码。

5.3 现象:登录页能打开,但输入账号密码后报 SQLException

原因:数据库里没有对应账号。这套源码默认在 user 表里放管理员和收银员账号,如果你执行 SQL 文件时只建了表没插入数据,登录就会卡在这一步。

解决:查一下 user 表是否为空:SELECT * FROM user;。如果空,把源码 SQL 文件里的 INSERT 语句单独执行一遍;如果 SQL 文件也没有,手动插一条:INSERT INTO user (username, password, role) VALUES ('admin', 'admin', '管理员');。注意表名如果叫 user,在 MySQL 里是保留字,执行时得加反引号包起来。

5.4 现象:Tomcat 启动正常但所有 Servlet 都 404,控制台也没报错

原因:Web 项目没有被标记为 Dynamic Web Project,或者 web.xml 里的 Servlet 映射路径跟 JSP 里写的 action 路径不一致。

解决:右键项目 Properties > Project Facets,勾上 Dynamic Web Module,版本选 3.0,点应用。再去 web.xml 里核对 servlet-mapping 的 url-pattern,比如 CheckoutServlet 映射为/checkout,那 JSP 里表单 action 就要写<form action="checkout" method="post">。如果 JSP 在子目录里,前面还要带上下文路径<%=request.getContextPath()%>/checkout,少了这个同样找不到页面。

6. 验证整个流程走通:从登录到结账再到统计报表的实测路径

项目跑起来的最后一步一定不是看一眼登录页就结束。我习惯按业务流走一遍全链路,这能同时验证数据库、Servlet 映射、库存更新、报表统计四个环节有没有问题。第一步先用管理员账号登录后台,检查菜单里商品管理、采购管理、供应商管理、统计报表都能打开,这说明管理员页面的所有 Servlet 映射没有遗漏。第二步退出登录,换成收银员账号,录入几件商品走一次结账。结账完成后去数据库执行SELECT stock FROM product WHERE id = 商品编号;,确认库存数字减了对得上。第三步切回管理员界面打开销售排行报表,看刚结的这笔有没有出现在报表里。如果报表有数据,整个系统的主干链路全部通。

如果你想给这套系统在答辩里加亮点,我建议从两个方向改:一是把 DaoImpl 里的 PreparedStatement 统一替换成连接池方式,比如 HikariCP 或阿里 Druid,原理不复杂但讲出来是亮点;二是在统计模块的 SQL 里增加时间维度,比如按天、按周分组销量,SQL 只需在 GROUP BY 后面加个日期字段。这两处改造本质上没动三层结构,但面试官和答辩老师都会对这一层更感兴趣。

我现在拿到任何旧代码的第一个习惯,是把所有局部变量名、SQL 字段名和数据库表名建一个映射清单,确认它们不是靠硬编码拼出来的。这套系统里有一处把用户名写死在登录验证里的情况——如果改成从 session 取角色权限,代码会干净很多。

最后说一个我从这套源码上真正学到的教训:拿到任何旧项目源码,第一件事永远不是双击运行,而是全局搜索localhost、root、123456这三个关键词。把它们的位置、上下文改清楚,比盲猜报错原因省一晚上时间。而且我强烈建议别用一个项目配一个乱码密码,所有本地开发统一用一个密码,改一处全局生效。这套系统我前前后后跑了不止一遍,切记:驱动、JDK、Tomcat、MySQL 版本四者只要各自保持在自己熟悉的组合里,整个链路不会出幺蛾子。希望这篇笔记在你手里的这套系统上能帮你少走点弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询