简介:这套Java课程设计项目实现饭卡管理系统,面向Java初学者与课程设计在校生,基于JavaSwing和JavaFX构建用户界面,配合MySQL完成食堂饭卡业务的数据增删改查,覆盖用户端与管理端的核心逻辑,适合作为桌面应用与数据库课程的实践参考。资源总文件数为56个,压缩包仅811KB,除Java源码与class文件外,还包含FXML界面布局、XML工程配置、SQL建库脚本、frm表结构、trn/trg数据库逻辑文件、vsdx绘制的ER图与系统功能图、逻辑设计流程图,以及可运行的jar包和数据库表设计说明文档。其中ER图与系统功能图展示表间关系和整体模块划分,流程图呈现用户端的操作路径,可视化素材可帮助理解业务流转并支撑文档撰写。目前已有2699人学习下载,适合需要快速完成课程设计或想掌握Swing/FX与MySQL整合开发的中初级读者直接复用。通过该资源可获取完整项目骨架、数据库设计文档与图示,既能对照代码理解登录、操作、查询等典型模块,也能借助ER图和流程图补齐课程设计所需材料,省去从零梳理的时间。
1. 饭卡管理系统:Java 课程设计里最典型的增删改查样板
饭卡管理系统是 Java 课程设计里出现频率最高的题目之一,不考算法,考的是 Swing/JavaFX 界面搭起来、MySQL 建表、增删改查跑通的实战能力。这份资源是博主“第四维度”整理的完整课设项目包,源码、mealsystem.sql 数据库脚本、ER 图、系统功能图、用户端流程图、数据库表设计文档都在里面,基本覆盖课设要交的全套材料。适合两类人:一是 Java 刚学完、课设没头绪的学生,拿到后改几处配置就能跑;二是想看看课设里 Swing 与 JavaFX 怎么混用、JDBC 连接有哪些坑的从业者。先说结论:这项目能不能在你机器上跑起来,关键不在界面代码,而在数据库脚本与连接配置。下面按表结构、源码阅读、踩坑记录、改进自测的顺序展开。
2. 数据库设计与文档:先从 mealsystem.sql 和 ER 图看清项目全貌
拿到压缩包后,我建议不要急着解压就把 IDEA 打开,先花十分钟把文件清点一遍,然后从数据库开始。原因很简单:这个系统所有功能的落点都在 MySQL 上,界面再好看,表建不对,登录都进不去。项目包里和数据库相关的材料有四份:mealsystem.sql 是真正的建库建表脚本,程序运行靠它;ER图.vsdx 描述表与表之间的关系;数据库表的设计.docx 是逐表字段的说明文档;系统功能图.vsdx 和用户端的逻辑设计.vsdx 画的是模块划分和流程走向。这四份材料各有各的用途,下面两节分开讲。
2.1 四张核心表:用户、卡片、充值、消费怎么设计
用文本编辑器打开 mealsystem.sql,能看到完整的 CREATE DATABASE 和 CREATE TABLE 语句。课设饭卡系统的表结构有很强的套路,核心是四张表:用户表存学号和姓名,饭卡表存卡号和余额,充值记录表存钱的流入,消费记录表存钱的流出,有的项目还会加管理员表。下面这段是我按常见做法补的典型建表脚本,方便你对照着看真实脚本(实际表名和字段可能叫 t_user、meal_card、user_info 之类,以压缩包里的脚本为准):
CREATE DATABASE meal_card DEFAULT CHARACTER SET utf8mb4; USE meal_card; CREATE TABLE t_user ( user_id VARCHAR(20) NOT NULL COMMENT '学号/工号', user_name VARCHAR(50) NOT NULL COMMENT '姓名', user_type TINYINT DEFAULT 0 COMMENT '0学生 1教职工', phone VARCHAR(20) DEFAULT NULL, PRIMARY KEY (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; CREATE TABLE t_card ( card_id VARCHAR(20) NOT NULL COMMENT '卡号', user_id VARCHAR(20) NOT NULL COMMENT '所属用户', balance DECIMAL(10,2) DEFAULT 0.00 COMMENT '余额', status TINYINT DEFAULT 1 COMMENT '1正常 0挂失 2注销', create_time DATETIME DEFAULT NULL, PRIMARY KEY (card_id), KEY idx_user (user_id), CONSTRAINT fk_card_user FOREIGN KEY (user_id) REFERENCES t_user(user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='饭卡表';看脚本时要抓住三个设计选择。第一,主键用 VARCHAR(20) 而不是自增 INT,学号本身唯一且业务上稳定,省去自增 ID 和学号的映射,课设里这么写很普遍。第二,balance 用 DECIMAL(10,2) 而不是 FLOAT,金额字段用浮点类型,0.1 加 0.2 会算出 0.30000000000000004,账单对不上是答辩里最尴尬的问题。第三,外键建在 t_card.user_id 上,保证每张卡一定属于一个已存在的用户,删除用户时外键会拦截,这个拦截行为未必是坏事,第 4.5 节我会专门展开。
充值与消费记录表的写法类似,共同点是必须带金额、时间和关联卡号三件套。以充值记录表为例:
CREATE TABLE t_recharge ( id INT PRIMARY KEY AUTO_INCREMENT, card_id VARCHAR(20) NOT NULL COMMENT '卡号', amount DECIMAL(10,2) NOT NULL COMMENT '充值金额', recharge_time DATETIME NOT NULL COMMENT '充值时间', operator VARCHAR(20) DEFAULT NULL COMMENT '操作员', KEY idx_card (card_id), CONSTRAINT fk_recharge_card FOREIGN KEY (card_id) REFERENCES t_card(card_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充值记录表';两张表串起来看逻辑就清楚了:t_user 决定“谁”,t_card 决定“有多少余额”,t_recharge 和 t_consume 决定“钱怎么进出”。导入 mealsystem.sql 之后,你还会发现脚本尾部通常预置了测试数据,一般是几个学生用户、一张余额几百块的卡,这是给你登录测试用的,别一上来就把测试数据删掉,不然还得自己往表里塞数据才能演示。
2.2 ER图、系统功能图、流程图:三份 vsdx 各自看什么
ER图.vsdx 打开后能看到表之间的连线,这是理解项目全貌最快的方式。饭卡领域的 ER 图关系很固定:用户表与饭卡表是一对一,一个用户对应一张卡;用户表与充值记录表是一对多;饭卡表与消费记录表是一对多。看 ER 图不要只盯着线,要对照 2.1 的建表脚本确认外键是否真实存在——有些课设项目的 ER 图画得很漂亮,但脚本里并没有建外键,逻辑关系只在代码里用 WHERE 条件关联。这种“图上有关联、库里没外键”的情况非常常见,答辩时老师追问一句“数据库层面怎么约束的”,答不上来会很被动。所以拿到 ER 图后,建议在 Navicat 或命令行里执行 SHOW CREATE TABLE t_card; 看一眼 FOREIGN KEY 到底有没有。
系统功能图.vsdx 看的是模块划分。饭卡系统的最低配置是六块:用户登录、余额查询、充值、消费、挂失解挂、流水查询。你在答辩 PPT 里放这张图,讲“我的系统分为六个模块”,老师基本不会追问细节。用户端的逻辑设计.vsdx 是一张流程图,从程序入口开始,画登录判断、操作循环、退出分支。这份图的价值在于:老师问“你的程序怎么走的”时,你照着流程图的顺序讲一遍登录→选择操作→执行→回到菜单,比临时组织语言顺很多。
另外那份数据库表的设计.docx,对交课设报告的人来说是现成的表格材料,里面逐表列出字段名、类型、长度、是否为空、注释。我的建议是把它和 ER 图对着看一遍,因为课程设计文档经常出现图不对文的情况——ER 图里画了外键,文档里没写,或者字段类型两处不一致。碰上不一致,以 mealsystem.sql 里的实际建表语句为准,因为程序跑起来用的是脚本,不是文档。
2.3 导入 SQL 的三个要点:字符集、外键顺序、版本兼容
导入 mealsystem.sql 是跑通项目的第一步,这一步我遇到过三种不同的报错。第一种是中文乱码:导入后打开表,中文全变成 ??。原因通常是 sql 文件本身是 UTF-8 编码,但 MySQL 客户端连接用的字符集不是 UTF-8。解决方法是导入前先执行 SET NAMES utf8mb4;,用 Navicat 则在连接属性里把编码设为 utf8mb4 再运行脚本。第二种是外键顺序问题:脚本里如果同时建了父表和子表,建表语句又带着外键约束,导入时必须先建 t_user、t_card,再建 t_recharge、t_consume,否则 MySQL 会报“无法创建表,外键不存在”。正常一个完整 sql 脚本会按正确顺序写,但如果你只把建表语句复制出来一部分单独执行,就容易踩这个坑。第三种是版本兼容问题,我在第四章专门讲,这里先记住一个结论:压缩包里带的 mysql-connector-java-5.0.0-beta-bin.jar 对应 MySQL 5.x 时代,你本机若是 MySQL 8.0+,连接配置和驱动类名都得改。
3. Java 源码阅读路线:从 DBUtil 到 Swing/JavaFX 界面
3.1 src 目录结构与入口类:别一上来就运行
解压后你会看到 src 目录里是 edu 开头的包路径,这是教学项目常见的包名风格。用 IntelliJ IDEA 打开项目根目录下的 JavaFxApplication.iml,IDEA 会识别出这是一个 Java 工程。我的习惯是:先不点绿色运行按钮,把 src 下的包结构展开,快速分清四类代码的位置。第一类是 view 或 ui 包,放着 JFrame 主窗口、登录窗口;第二类是 dao 包,放着和数据库打交道的类;第三类是 model 包,放着对应数据库表的实体类,比如 User、Card、Recharge;第四类是 util 包,放着 DBUtil 这种数据库连接工具。
课设项目的命名规范往往不统一,博主可能用 edu 开头后接自己的用户名,未必叫 system,但 view、dao、model 这类语义词在包名里通常会出现。你只要找到包含 Class.forName 或者 DriverManager.getConnection 的那个类,那就是全局连接入口。整个项目能跑起来的前提,就是先把这个类里的数据库地址、用户名、密码改成你本机的。另外提醒一句:如果你用 JDK 17 及以上版本运行这个 2021 年的项目,编译和运行都可能遇到模块化相关的警告,最常见的是 java.xml.bind 或 java.desktop 模块缺失,本质是 JDK 版本太新,换 JDK 8 或 11 通常直接解决。
3.2 JDBC 连接工具类:三个必改的参数
项目的持久层用的是最原始的 JDBC,没有 MyBatis、没有 Hibernate,这在课程设计里反而是加分项——老师一看代码就知道你懂 Connection、PreparedStatement、ResultSet 这套基础。连接工具类的代码结构基本如下,你打开压缩包找到的 DBUtil 应该也是类似的:
import java.sql.*; public class DBUtil { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/meal_card_system?useUnicode=true&characterEncoding=utf8"; private static final String USER = "root"; private static final String PASSWORD = "123456"; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }这段代码有四个必看参数。第一,DRIVER 对应你引入的驱动 jar 包版本:com.mysql.jdbc.Driver 是老版 MySQL 5.x 驱动的类名,MySQL 8.x 驱动改成了 com.mysql.cj.jdbc.Driver,如果你换了高版本 jar 包却不改这里,运行必报 ClassNotFoundException。第二,URL 里的数据库名 meal_card_system 必须和 mealsystem.sql 里 CREATE DATABASE 后面的名字一致,大小写不敏感但名字要能对得上。第三,URL 里的 useUnicode=true&characterEncoding=utf8 这两个参数就是为中文乱码准备的,千万别删。第四,PASSWORD 是博主本机的密码,默认多半是 123456,你改成自己 MySQL 的密码之前,先确认本机 MySQL 能通过 root 正常登录。
jar 包的位置也值得说一句。mysql-connector-java-5.0.0-beta-bin.jar 在压缩包的 lib 目录下,IDEA 不会自动加载它。你需要右键 jar 包,选择 Add as Library,或者打开 Project Structure → Modules → Dependencies 手动添加。Eclipse 用户则是 Build Path → Add External Archives。很多拿到项目的人第一步就是被这个 jar 包绊住的,程序报 ClassNotFoundException 不是代码问题,是依赖没加进去。
3.3 增删改查的三种写法:PreparedStatement、事务、返回结果
饭卡系统的增删改查核心就四件事:查余额、充值、消费、查流水。用 JDBC 写这四件事是同一个模板:组装 SQL、创建 PreparedStatement、设置参数、执行并处理结果。查余额的代码:
public double queryBalance(String cardId) { String sql = "SELECT balance FROM t_card WHERE card_id = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, cardId); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { return rs.getDouble("balance"); } } } catch (SQLException e) { e.printStackTrace(); } return -1; // 卡号不存在或查询失败时返回-1,界面层据此提示 }这段代码有两点值得你答辩时主动讲。第一,用 PreparedStatement 而不是 String 拼接 SQL,参数用 ? 占位,能挡住 SQL 注入,这是老师必问的安全知识点。第二,使用 try-with-resources 写法,Connection、PreparedStatement、ResultSet 都实现了 AutoCloseable,代码块结束会自动关闭,避免老式代码里忘关连接导致的“连接数耗尽”。返回值设计成 -1 表示失败,是一个简单有效的约定,但要注意 double 拿来做业务返回值会有精度问题——真实系统里余额字段要么用 BigDecimal,要么用以分为单位的整数,课程设计用 double 能演示功能,别在技术上较真这一点。
充值的写操作代码:
public boolean recharge(String cardId, double amount) { String sql = "UPDATE t_card SET balance = balance + ? WHERE card_id = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setDouble(1, amount); ps.setString(2, cardId); return ps.executeUpdate() == 1; } catch (SQLException e) { e.printStackTrace(); return false; } }注意这里的 SQL 写法是直接在余额上做加法:balance = balance + ?。这么做在课程设计里没问题,但在真实系统里有明显缺陷——充值只改了余额,没有在充值记录表里留痕,月底对不了账。第五章我会给两段绑定的方案,这里先记住:executeUpdate 的返回值是受影响行数,等于 1 说明更新成功,等于 0 说明卡号不存在。
消费的代码和充值几乎一样,只是把 + 换成 -,再加一道余额是否充足的判断。查流水的代码则是把 SELECT 结果集逐行读入 List,差异不大。整个项目里,把这套模板理解透,你就有能力自己加功能了,比如加一个换卡操作:先 UPDATE 原卡 status=2,再 INSERT 一张余额相同的新卡,两步用一个事务包住。
3.4 Swing 与 JavaFX 混用:UI 线程的两个切身体会
这个项目的 UI 是 Swing 和 JavaFX 混用的。主窗口是 Swing 的 JFrame,登录进去后某些功能窗口用了 JavaFX。两套 UI 框架底层是两套线程模型:Swing 组件只能在 EDT(Event Dispatch Thread)上更新,JavaFX 节点只能在 FX Application Thread 上更新,互相不能直接操作。混用项目最常见的翻车是这样的:在 JavaFX 的事件处理器里直接调 JDBC 查询,数据库响应稍慢,整个界面就僵住,拖都拖不动。
原因在于数据库操作是阻塞调用,如果写在事件线程里,这个线程被占住,界面刷新、点击事件全部排队。正确习惯是把数据库操作放到子线程,拿回结果后再通过 Platform.runLater 或 SwingUtilities.invokeLater 切回 UI 线程更新界面。很多课设代码为了省事直接在事件线程里查库,查一次两次看不出问题,一旦数据量上来或者网络抖动,界面卡死就成了必然。你拿到这个项目后,如果发现运行起来点击查询会白屏几秒,基本就是这个原因,优先检查事件处理的方法体里有没有直接的 JDBC 调用。另外,如果 JavaFX 窗口初始化失败,Swing 主窗口启动也可能被连带拖垮,表现为程序启动后一片空白没有窗口。遇到这种情况,先单独把 JavaFX 相关代码注释掉,跑通纯 Swing 的部分再逐个加回来定位是哪一行的问题。
4. 避坑指南:从导库到跑通,五个我踩过的坑
这一部分写的都是我实际遇到过、或者身边同事学生反复出现的问题。每个问题按现象、原因、解决的顺序说,你照着排查比自己瞎试快得多。
4.1 驱动类找不到:ClassNotFoundException 的排查顺序
现象:运行程序,控制台第一行就是 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,程序直接退出,登录窗口都出不来。
原因:绝大多数情况不是代码问题,而是 mysql-connector-java-5.0.0-beta-bin.jar 没有进入项目依赖。IDEA 打开别人项目的 iml 文件时不一定会自动加载外部 jar,如果你在 Project Structure 里没看到这个 jar 引用,运行期自然找不到类。还有一种少见情况是你把 jar 加进来了但版本被替换成了 MySQL 8 的驱动,而 DRIVER 字符串还写着 com.mysql.jdbc.Driver,也会报类找不到,因为 8.x 驱动包里类名是 com.mysql.cj.jdbc.Driver。
解决:右键 lib 目录下的 jar,选择 Add as Library,确认 Modules 的 Dependencies 里出现这个条目,重新运行。Eclipse 则是 Build Path → Add External Archives。另外注意项目路径不要带中文,IDEA 对含中文或空格的路径处理偶尔会出问题,jar 引用的是绝对路径,路径一变就会加载失败。
4.2 MySQL 8.0 连不上:SSL 和时区两座大山
现象:连接数据库时报 The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized 或 SSL connection error,点击登录按钮后界面没有反应,控制台里是 CommunicationsException。
原因:驱动 jar 是 5.0.0-beta,对应 MySQL 5.x 时代。MySQL 从 8.0 开始默认认证插件是 caching_sha2_password,老驱动不认;同时 8.0 对时区参数更加敏感,URL 里不带 serverTimezone 就会报错。想确认你本机的 MySQL 版本,在命令行执行 SELECT VERSION(); 就能看到,8.0.x 的话基本就是这个问题。
解决:推荐换驱动而不是降 MySQL。去下载 mysql-connector-java-8.0.3x.jar,替换掉 lib 下那个 5.0.0-beta,同时把 DBUtil 里的 DRIVER 改成 com.mysql.cj.jdbc.Driver,URL 改成 jdbc:mysql://localhost:3306/meal_card_system?serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf8。三处一起改,MySQL 8 就能连上。如果实在必须用老驱动,就得在 MySQL 里建一个 mysql_native_password 认证插件的专用用户,新建用户并授权到 meal_card 库,但这条路比换驱动麻烦,我自己从来不用。
4.3 中文乱码:三处编码一定要对齐
现象:导入 mealsystem.sql 后打开表,中文全是 ??,或者程序界面上显示的名字是乱码,但数据库里是好的。
原因:乱码是三处字符集不统一叠加的结果。第一处是 sql 文件本身的编码,第二处是 MySQL 客户端导入时用的连接字符集,第三处是 JDBC URL 里的 characterEncoding 参数,三处有一个不是 UTF-8 就会乱。
解决:第一步,用文本编辑器把 mealsystem.sql 另存为 UTF-8 编码,注意不是 UTF-8 with BOM,带 BOM 反而可能让 MySQL 误判。第二步,导入时先执行 SET NAMES utf8mb4;,Navicat 用户检查连接属性的编码设置。第三步,确认 DBUtil 的 URL 里带 useUnicode=true&characterEncoding=utf8。排查时先在客户端里 SELECT * FROM t_card; 看原始数据,如果客户端正常、程序乱码,问题定位在 JDBC URL;如果客户端也乱,问题在导入环节,这条判断能把排查范围缩小一半。
4.4 vsdx 打不开:没有 Visio 的替代方案
现象:双击 ER图.vsdx 或系统功能图.vsdx,Windows 提示“没有应用打开此文件”。
原因:vsdx 是 Visio 的专用格式,办公电脑上普遍没有装 Visio。这和三份文件本身没关系,是查看工具的问题。
解决:三个替代方案按优先级排。第一,学生可以申请学校提供的 Office 365 教育版,里面带 Visio for the web,能直接打开看。第二,用 draw.io 这类工具,在导入功能里选择 vsdx 文件,会转换出可编辑的图形结构;如果只是答辩 PPT 需要截图,直接截图足够,别追求完美还原。第三,最省事的办法是让身边装了 Visio 的人把图导出成 PDF 或 PNG,放进课设报告里用。答辩交材料时,我不建议交 vsdx 原文件,老师机器上大概率也打不开,PDF 和图片才是稳妥选择。
4.5 外键约束拦路:删除用户失败
现象:在界面上执行删除某个用户的操作,程序报 Cannot delete or update a parent row: a foreign key constraint fails,控制台指向 t_recharge 或 t_consume。
原因:删除用户时,先删的是 t_card 或 t_user 这条主表记录,但子表里还有消费记录、充值记录引用着这张卡或这个用户,MySQL 的外键约束不允许直接删被引用的父行。要快速定位是哪个表在引用,执行下面这条 SQL 就能看到全部外键关系:
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 't_card';解决:先删子表数据再删父表,顺序是 DELETE FROM t_consume WHERE card_id=xx; 再 DELETE FROM t_recharge WHERE card_id=xx; 然后 DELETE FROM t_card WHERE card_id=xx; 最后 DELETE FROM t_user WHERE user_id=xx。如果项目代码里没有做这个顺序,就会触发报错。另一个方向是改表结构,给外键加 ON DELETE CASCADE,但答辩时老师问“级联删除有什么风险”,你得答得出来——关联数据都会被静默删除,极端情况下一张卡的消费记录全没了。课设我建议保持普通外键,在代码里控制删除顺序,安全也容易讲清楚。
5. 改造与自测:把课设项目变成能讲清楚的亮点
5.1 给流水查询加分页
原始代码查流水大概率是 SELECT * 然后整个表格灌进 JTable,数据只有几十条时没感觉,答辩演示时为了效果多造几条,体验马上就差了。我一般会改成 LIMIT 分页:
String sql = "SELECT * FROM t_consume WHERE card_id = ? ORDER BY consume_time DESC LIMIT ? OFFSET ?";第一个 ? 是每页条数,第二个 ? 是偏移量,由 (pageNo-1)*pageSize 计算。这个改动很小,但体现了你考虑过数据量增长后的性能问题,老师对课设的预期本来就不高,这个小点反而容易留下印象。
5.2 把充值改成“记账+更新余额”两步
前面说过直接在 balance 上做加法的缺陷。改进思路是充值方法里先 INSERT 一条 t_recharge 记录,再 UPDATE t_card 的余额,两步放在同一个事务里,用 conn.setAutoCommit(false) 开启事务,全部成功再 commit,失败就 rollback。这样系统里有了完整的资金流水,答辩时可以说“我的充值不是只改余额,而是记账和余额一起提交,保证一致性”,这句话的技术含量比“我能充值”高一个档次。
5.3 自测清单:每次跑通课设项目前我必过一遍
拿到任意一个课设项目,我在说“能跑”之前都会按这个清单走一遍。第一步,确认 mealsystem.sql 导入成功,用查询语句能看到 t_user、t_card 里有初始数据。第二步,确认驱动 jar 已加入 IDEA 依赖,DBUtil 里的用户名密码、数据库名都改成了本机的。第三步,运行程序,先做一次登录,登录成功说明连接层没问题。第四步,拿测试卡号充值一小笔,查询余额确认金额变化,再消费一次确认扣款正常。第五步,尝试删除一个有流水的用户,如果触发外键报错,说明外键约束在工作,这反而是好事。每一步过了再谈下一个功能,别一口气把所有功能点完再回来看报错。
这套自测流程我从那次被课设项目折腾到凌晨两点以后就固定下来了——当时就是没先检查驱动版本,程序启动十几次全是 ClassNotFoundException,后来才发现 lib 目录下 jar 包没被 IDEA 加载。从那以后我每次拿到陌生项目,都是先清点文件、改连接配置、列一个最小验证路径,跑通了再动界面。希望帮到你。
本文还有配套的精品资源,点击获取