新闻详情

新闻详情

首页 / 资讯中心 / 详情

Java Swing + MySQL停车场管理系统:JDBC连接与四表联动实战

发布时间:2026/10/1 3:30:17来源:尧图网络
Java Swing + MySQL停车场管理系统:JDBC连接与四表联动实战
简介一套基于JavaSwingMySQL的停车场管理系统完整项目面向Java初学者、课程设计及毕业设计人群解决车辆出入登记、停车位管理与计费交易等常见业务场景。系统覆盖面向对象编程、Swing事件驱动、JDBC数据库连接、MVC分层、并发控制及SQL注入防护等内容是理解Java桌面应用开发全流程的直观范例。压缩包共79个文件约2.08MB其中包含25个java源码、47个class编译产物、1个sql建表脚本、1个jar依赖库以及Eclipse工程配置和项目目录文件src、bin、sql、lib等目录划分明确下载后可导入开发环境直接运行并按源码、SQL脚本、编译产物对照学习。资源已获得2351人学习适合需要快速搭建停车场管理原型或完成课程报告的用户。解压后除了完整可运行代码和数据库脚本还能通过具体表结构设计车位表、车辆表、用户表、交易表与JDBC事务处理掌握从界面交互到数据落地的完整链路。1. JavaSwingMySQL停车场管理系统拿到手先别急着跑先理清这四件事JavaSwingMySQL停车场管理系统是Java课程设计里最典型的桌面增删改查项目——界面用Swing写数据落在MySQL中间靠JDBC串起来。很多同学拿到压缩包第一反应就是双击导入、点运行结果不是找不到驱动就是连不上数据库卡在第一步就放弃了。这个工程真正值钱的不在界面而在三层事MVC 怎么拆包、JDBC连接串里的参数坑以及车辆入场出场时 vehicles 表和 parking_spaces 表怎么联动。适合刚学完 Java 基础要交课程设计的人也适合想抄一套 Swing JDBC 模板快速改成别的桌面业务的人。动手之前先记住一句话先理清目录结构和数据库再谈跑起来。2. 工程结构与数据库设计src/lib/res/bin 各是什么四张表怎么建2.1 解压后别乱点这是一份标准的 Eclipse 工程压缩包解开以后你会看到.project、.classpath、.settings、src、lib、res、bin这些东西。.project和.classpath是 Eclipse 的工程描述文件说明这项目是 Eclipse 工程而不是 IDEA 工程。你要是用 IDEA 导入得选 Eclipse 方式导入你要是坚持用 Eclipse直接File - Import - Existing Projects into Workspace选目录就行。src是源码根目录按包组织一般能看到view、dao、model、util之类分包这就是典型的 MVC 思路view放 Swing 界面dao放 JDBC 数据库操作model放 User、Vehicle 这些实体类util放 DBUtil 这类工具类。lib里预置的是 mysql-connector-java 的 jar 包版本以你 lib 里的实际文件为准常见命名要么是mysql-connector-java-5.1.x.jar要么是mysql-connector-j-8.0.x.jarMySQL 8 对应 8.x 驱动老 MySQL 5.x 用 5.1.x。res放图标和图片资源像按钮图标、背景图。bin是 Eclipse 的编译输出目录src改完保存后.class文件都去那里一般不用手动碰。目录/文件作用需要改吗.projectEclipse 工程描述一般不动.classpath编译路径与依赖配置导入后检查srcJava 源码根目录核心修改区libMySQL JDBC 驱动 jar版本不对才替换res图标、图片、配置文件看需求bin编译输出目录不用管重新构建导入后第一件事是右键项目Build Path - Configure Build Path确认 JRE 版本和你本机一致同时确认lib里的 jar 已经被加进Libraries。很多项目导入后编译报错十有八九是 jar 没进 classpath这个问题在第四章细说。2.2 四张核心表users、parking_spaces、vehicles、transactions 怎么设计业务上就是两类人管理员、操作员一种资源车位两种动作入场、出场外加收费记录。所以表结构基本是固定的。users存操作员账号密码角色parking_spaces存车位编号、区域、状态0 空闲 1 占用vehicles存每一条车辆入场记录transactions存每一次出场扣费记录。表之间的关联也不复杂vehicles.space_id外键指向parking_spaces.idtransactions.vehicle_id指向vehicles.idtransactions.operator_id指向users.id。注意parking_spaces.status这个字段是整个系统状态联动的核心入场时把它从 0 改成 1出场时再把它从 1 改回 0哪边漏了 update界面上的车位状态就会失真。CREATE DATABASE IF NOT EXISTS parking DEFAULT CHARSETutf8mb4; USE parking; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL, role VARCHAR(20) DEFAULT operator, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE parking_spaces ( id INT AUTO_INCREMENT PRIMARY KEY, space_no VARCHAR(20) NOT NULL UNIQUE, area VARCHAR(50), space_type VARCHAR(20) DEFAULT standard, status TINYINT DEFAULT 0 COMMENT 0空闲 1占用 ); CREATE TABLE vehicles ( id INT AUTO_INCREMENT PRIMARY KEY, plate_no VARCHAR(20) NOT NULL, vehicle_type VARCHAR(20), space_id INT, entry_time DATETIME, exit_time DATETIME, fee DECIMAL(8,2) DEFAULT 0, FOREIGN KEY (space_id) REFERENCES parking_spaces(id) ); CREATE TABLE transactions ( id INT AUTO_INCREMENT PRIMARY KEY, vehicle_id INT, amount DECIMAL(8,2), pay_time DATETIME DEFAULT CURRENT_TIMESTAMP, operator_id INT, FOREIGN KEY (vehicle_id) REFERENCES vehicles(id), FOREIGN KEY (operator_id) REFERENCES users(id) ); INSERT INTO users(username, password, role) VALUES(admin, 123456, admin);这段 SQL 的逻辑说明建库时直接指定utf8mb4避免后续中文乱码vehicles的exit_time允许为空空就表示这辆车还在场内fee在入场时不填出场时算好再回填。参数说明上TINYINT存状态位够了DECIMAL(8,2)存金额不会出浮点误差。实际项目里是否用外键有争议但课程设计阶段保留外键反而能直观展示表关系答辩也好讲。2.3 初始化数据库用 Navicat 还是命令行都行关键是编码与时区SQL 脚本拿到手建议直接用 Navicat 打开新建查询把上面这段整体执行一遍。没有 Navicat 就用命令行mysql -u root -p parking.sql执行完以后验证一下SHOW TABLES; SELECT * FROM users;看到users表里有一条admin记录就说明库建成功了。这里有两个细节容易翻车第一如果你本机 MySQL 是 5.5 这种老版本utf8mb4是不支持的需要改回utf8但 MySQL 5.6 及以上都建议用utf8mb4第二如果你的 MySQL root 账号有密码上面命令行里的-p后面会交互式问密码不要直接在命令里明文写密码历史记录会留下隐患。建库成功后还要回到项目里去核对代码里的连接串和库名我会在第四章给一个完整的 DBUtil 模板。3. Swing 界面与事件流转登录、入场、出场三大块怎么串起来3.1 Swing 组件清单登录窗口到主界面用了哪些东西Swing 是 JDK 自带的不需要额外引依赖。这个系统的界面元素逃不出下面这些JFrame是顶级窗口JPanel是容器JTextField和JPasswordField负责输入JButton负责触发动作JTable负责展示车位列表和车辆记录JLabel放文字或图片JTabbedPane做功能分区。界面模块核心组件业务动作登录窗口JTextField、JPasswordField、JButton校验用户名密码主窗体JTabbedPane、JPanel功能分区导航车位管理JTable展示车位状态车辆入场JTextField、JComboBox、JButton登记车辆入场车辆出场JTable、JButton计费并出场常见误用是直接setLayout(null)加setBounds()写死坐标换台电脑分辨率一变界面就乱。正规做法是BorderLayout分区加GridLayout排按钮或者用GroupLayout。课程设计里写死布局很常见你看明白就行不用花大力气重构除非你想把项目当作品集展示。主界面的骨架一般是这样的public class MainFrame extends JFrame { public MainFrame(User currentUser) { setTitle(停车场管理系统); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTabbedPane tabs new JTabbedPane(); tabs.addTab(车位管理, new SpacePanel()); tabs.addTab(车辆入场, new EntryPanel(currentUser)); tabs.addTab(车辆出场, new ExitPanel(currentUser)); add(tabs, BorderLayout.CENTER); pack(); } }逻辑说明JTabbedPane把三大功能切成三个 Tab每个 Tab 放一个JPanel。currentUser从登录窗口传进来后续出场记录里记操作员就靠它。参数说明pack()会根据内容自适应窗口大小比setSize()更稳。注意 Swing 组件更新必须放在事件分发线程如果你在后台线程里改了表格数据界面可能不刷新最好用SwingUtilities.invokeLater包一层。这个项目多半没写线程池但答辩被问到并发时可以提一句SwingWorker是 Swing 里处理耗时任务的规范做法。3.2 登录校验与角色跳转查 users 表别拼字符串 SQL登录按钮的监听器是整个系统最容易被抄错的地方。常见错误是把密码框getPassword()的返回值直接赋给 String而它返回的是char[]。下面是标准写法private void doLogin() { String username usernameField.getText().trim(); String password new String(passwordField.getPassword()); if (username.isEmpty() || password.isEmpty()) { JOptionPane.showMessageDialog(this, 用户名和密码不能为空); return; } User user userDao.findByUsernameAndPassword(username, password); if (user ! null) { JOptionPane.showMessageDialog(this, 欢迎 user.getRole()); new MainFrame(user).setVisible(true); dispose(); } else { JOptionPane.showMessageDialog(this, 用户名或密码错误); } }逻辑说明getText().trim()去掉输入框首尾空格避免用户手滑多敲一个空格导致登录失败new String(passwordField.getPassword())是把 char 数组转成字符串做比对虽然这里有内存泄漏的小隐患但课程设计这么写是普遍做法。校验通过后把User对象传给主界面再dispose()释放登录窗口。对应的 DAO 方法应该用预编译语句public User findByUsernameAndPassword(String username, String password) { String sql SELECT * FROM users WHERE username? AND password?; try (PreparedStatement ps connection.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { return new User(rs.getInt(id), rs.getString(username), rs.getString(role)); } } } catch (SQLException e) { e.printStackTrace(); } return null; }逻辑说明?占位符由setString绑定参数而不是把用户名密码直接拼进 SQL 字符串这是防 SQL 注入的标准做法。参数说明try-with-resources会在语句执行完自动关闭PreparedStatement和ResultSet不用手写一堆 finally。这里有个前提connection得是外部传入或用完即关的连接课程设计里通常直接在 DAO 内部调DBUtil.getConnection()用完再关也可以接受只是性能差点。生产环境会把DriverManager.getConnection换成连接池比如 HikariCP 或 DruidSQL 写法不变拿连接的方式变。3.3 入场与出场vehicles 表和 parking_spaces.status 的联动入场动作本质是两步先查车位是不是空闲空闲就占掉再往vehicles插一条entry_time为当前时间的记录。出场动作本质是三步查这辆车有没有未出场的记录算费用回填然后释放车位并往transactions插一条收费记录。出场这一段最容易出问题多表更新不包事务的话会出现扣费了但车位没释放的状态错乱public void exitVehicle(String plateNo, int operatorId) { String findSql SELECT id, space_id, entry_time FROM vehicles WHERE plate_no? AND exit_time IS NULL; try (PreparedStatement ps conn.prepareStatement(findSql)) { ps.setString(1, plateNo); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { int vehicleId rs.getInt(id); int spaceId rs.getInt(space_id); Timestamp entryTime rs.getTimestamp(entry_time); long minutes (System.currentTimeMillis() - entryTime.getTime()) / 60000; double fee Math.ceil(minutes / 60.0) * unitPrice; String updateV UPDATE vehicles SET exit_timeNOW(), fee? WHERE id?; String updateS UPDATE parking_spaces SET status0 WHERE id?; String insertT INSERT INTO transactions(vehicle_id, amount, operator_id) VALUES(?,?,?); // 三个操作必须包在同一个事务里 conn.setAutoCommit(false); try { // 依次执行 updateV、updateS、insertT conn.commit(); } catch (Exception e) { conn.rollback(); throw e; } finally { conn.setAutoCommit(true); } } } } }逻辑说明Math.ceil(minutes / 60.0)是向上取整不满一小时按一小时计费这是停车场常见的计费规则。参数说明unitPrice是单小时费率一般放在配置类或数据库参数表里fee算出来后同时写进vehicles.fee和transactions.amount两张表都能单独查账。setAutoCommit(false)加commit()是保证数据一致性的关键你如果面试被问到数据库一致性怎么保证这个就是标准的本地事务答案。入场方向的联动逻辑类似只是把status1和INSERT INTO vehicles(entry_time)放一起。入场前还要判断车位状态避免同一车位被两辆车同时选中UPDATE 语句里带上AND status0条件是最简单的保证方式。4. JDBC 连接 MySQL 避坑指南五个高频报错的现象、原因与解决4.1 ClassNotFoundException: com.mysql.jdbc.Driver现象运行后在控制台看到java.lang.ClassNotFoundException: com.mysql.jdbc.Driver程序直接终止。原因驱动 jar 没有进到 Build Path。Eclipse 导入工程时lib目录不会被自动加进 classpath需要手动加。解决右键项目Properties - Java Build Path - Libraries - Add JARs选lib下的 mysql-connector jar然后在Order and Export里勾选它。也可以用下面命令先确认 jar 在不在ls lib/ # 常见命名mysql-connector-java-5.1.49.jar 或 mysql-connector-j-8.0.33.jar少见的情况是驱动类名写错。老驱动加载com.mysql.jdbc.Driver新版驱动推荐com.mysql.cj.jdbc.Driver8.x 下两个都能用但旧的会打 deprecation 警告。DBUtil里静态块加载驱动是标准姿势public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/parking?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private static final String USER root; private static final String PASSWORD 你的密码; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }参数说明MySQL 8 用com.mysql.cj.jdbc.DriverURL 里的useSSL、serverTimezone、characterEncoding三个参数下面单说。这里PASSWORD一定要改成你自己 MySQL 的真实密码模板里写死123456是导致第四条报错的最常见原因。4.2 MySQL 8 的 SSL 与时区连接串一次加齐三个参数现象用 5.x 老项目的连接串直连 MySQL 8报Communications link failure或者弹出一长串 SSL 警告后连接失败再或者报Public Key Retrieval is not allowed。原因MySQL 8 默认认证插件是caching_sha2_password驱动握手时需要处理 SSL 和 RSA 公钥老连接串没有对应参数。解决URL 上加三个参数useSSLfalse关掉 SSL 握手allowPublicKeyRetrievaltrue允许客户端向服务端请求公钥serverTimezoneAsia/Shanghai指定时区。连起来就是上面 DBUtil 里那一串。注意serverTimezone别用GMT%2B8这种写法在 URL 里会被解析成空格直接写Asia/Shanghai最省事。4.3 中文乱码车牌和用户名存进去变成问号现象页面上输入中文车牌INSERT到 MySQL 后变成????或者编辑器里读出来是乱码。原因三层里至少有一层字符集不对——数据库/表字符集不是 utf8、连接串没指定characterEncodingutf8、MySQL 服务端默认字符集不对。解决建库建表统一用utf8mb4连接串加characterEncodingutf8再用下面这条 SQL 检查服务端配置SHOW VARIABLES LIKE character_set%;正常情况下character_set_server应该是utf8mb4或utf8。如果不对改 MySQL 配置文件my.ini里character-set-serverutf8mb4改完重启 MySQL 服务。课程设计阶段最容易漏的是连接串没加characterEncoding改 DBUtil 那一行就能解决大部分乱码。4.4 Access denied for user rootlocalhost (using password: YES)现象启动项目后报java.sql.SQLException: Access denied for user rootlocalhost (using password: YES)。原因DBUtil 里写死的账号密码和你本地 MySQL 的真实密码不一致。课程设计代码交付时普遍写的root / 123456而你自己 MySQL 的密码可能是其他的。解决先把 DBUtil 里的PASSWORD改成你自己的密码。如果你忘了 MySQL root 密码可以在 MySQL 命令行里重置ALTER USER rootlocalhost IDENTIFIED BY 新密码; FLUSH PRIVILEGES;注意 MySQL 8 默认有密码强度校验设置太简单的密码会被拒。这是最省事的路径不建议去碰--skip-grant-tables那种粗暴重置方式容易把权限表搞坏。4.5 Cant connect via socket /tmp/mysql.sockMySQL 服务根本没启动现象第一次跑这项目时报ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock或者CommunicationsException。原因你本机 MySQL 服务没启动或者压根没装 MySQL。这个问题严格说不是项目 bug是环境没准备好。解决先走一遍 MySQL 安装配置确保服务在跑。Windows 下在services.msc里找 MySQL 服务并启动Linux 用systemctl start mysqldMac 用brew services start mysql。启动后再执行一次mysql -u root -p -e SHOW DATABASES;能列出库列表就说明服务正常。这条血泪经验来自我接手过的课程设计辅导——至少三分之一的人卡在项目连不上数据库最后发现是 MySQL 服务没开跟代码一毛钱关系都没有。5. 复现与自检把出入场流程完整跑一遍再改三处参数练手5.1 三步自检登录、入场、出场用两条 SQL 验证状态联动启动项目后不要只点两下按钮就完事。我一般会按真实业务顺序走一遍先用admin / 123456登录把界面上的车位管理 Tab 打开记录某个车位当前是空闲然后到车辆入场 Tab 输入一个测试车牌选那个车位入场接着回到车位管理看状态是否已变成占用最后到出场 Tab 对该车牌出场确认弹出计费金额。界面验证完后再用 SQL 做数据层复核。入场后执行这条看车位和车辆是否联动SELECT p.space_no, p.status, v.plate_no, v.entry_time FROM parking_spaces p LEFT JOIN vehicles v ON v.space_id p.id AND v.exit_time IS NULL WHERE p.status 1;出场后再执行这条看费用和交易记录是否完整SELECT v.plate_no, v.entry_time, v.exit_time, v.fee, t.amount, t.pay_time FROM vehicles v JOIN transactions t ON t.vehicle_id v.id ORDER BY t.pay_time DESC LIMIT 10;这两条 SQL 的价值是把你界面上看到的表象和数据层的事实对齐。课程设计答辩时演示完界面再补这两条查询结果比空口讲功能有说服力得多。5.2 改三处参数练手费率、管理员密码、连接串想快速吃透这项目动手改三个地方。第一费率。在代码里找到unitPrice或计费常量把它改成0.01或0.1方便用极短停车时间验证计费公式是否正确。第二管理员密码。改users表里admin的密码再去界面登录试试确认改动生效UPDATE users SET passwordyour_new_password WHERE usernameadmin;第三连接串。把 DBUtil 里的localhost:3306改成远程服务器地址比如jdbc:mysql://192.168.1.100:3306/parking前提是远程 MySQL 开了对应权限和防火墙端口。这个练习做下来你对项目的掌控程度会明显不一样。说到底这套工程跑通的价值不只是交一次作业。从那以后我每次拿到类似的 Swing JDBC 项目都会强制先走一遍「登录 → 业务操作 → SQL 复核」全流程再动代码很少再被莫名其妙的连接问题卡住。这份资源值得下载的正是这套完整可跑的骨架希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

人脸静默活体检测项目实战:原理、训练与部署 2026/10/1 4:29:42

人脸静默活体检测项目实战:原理、训练与部署

简介:这套基于深度学习的Python人脸静默活体检测项目源码,面向计算机相关专业正在准备毕业设计或期末大作业的学生,也适合需要完整实战项目练习的开发者,主要解决人脸防伪场景中的静默活体识别问题,涉及MTCNN人脸检测与…

阅读更多 →
PNET导入锐捷镜像完整指南:从目录规范到启动排查 2026/10/1 4:29:42

PNET导入锐捷镜像完整指南:从目录规范到启动排查

做网络实验的人,谁还没在模拟器上折腾过几次。思科有PacketTracer、CML,华为有eNSP,H3C有HCL,轮到锐捷的时候突然就安静了——官方没有一个足够通用的模拟器,可真实项目里锐捷的交换机、路由器、无线AC,尤其…

阅读更多 →
区域综合能源系统多能耦合能流计算的Matlab实现与经验总结 2026/10/1 4:29:42

区域综合能源系统多能耦合能流计算的Matlab实现与经验总结

做电力系统潮流计算的朋友,第一次接触区域综合能源系统这个课题时,多少都会有个错觉:电气热能流计算嘛,无非就是把电网潮流、气网潮流、热网潮流分别跑一遍,最后再拼在一起。真正动手以后才发现,三个网络各…

阅读更多 →
AI Agent 的 Office 运行时:Univer 表格交互与并发实践 2026/10/1 4:29:42

AI Agent 的 Office 运行时:Univer 表格交互与并发实践

1. 为什么 AI Agent 需要一个“Office 运行时”1.1 从“会聊天”到“会干活”的断层过去两年我一直在做 AI Agent 相关的落地项目,从最早的纯对话机器人,到后来接工具调用、接 RAG、接工作流编排,踩过的坑基本能写一本书。但真正让我意识到问…

阅读更多 →
AI应用底座实战:从模型网关到Agent编排的关键技术解析 2026/10/1 4:29:42

AI应用底座实战:从模型网关到Agent编排的关键技术解析

最近不少团队都在聊一个词:AI应用底座。有人把它理解成大模型管理后台,有人以为是低代码平台,其实都不太准。我在企业落地的项目里见过太多这种情况:模型API调通了,demo也能跑,真到生产环境就卡在数据权限、…

阅读更多 →
从零开始AI工程:数据准备、模型部署与踩坑实战指南 2026/10/1 4:29:35

从零开始AI工程:数据准备、模型部署与踩坑实战指南

我带过不少人入门AI工程,也被问过无数次同一个问题:“我想做一个AI项目,但完全不知道从哪一步开始,应该先学什么?”说实话,这个问题的答案比大多数人想象的要朴实得多。它不是去读什么顶级论文,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉