ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java Swing+MySQL停车场管理系统源码详析:课设毕设完整模板

Java Swing+MySQL停车场管理系统源码详析:课设毕设完整模板 简介基于Java Swing与MySQL的停车场管理系统项目面向Java初学者、课程设计学生或需要快速搭建桌面应用的人员。资源围绕车辆信息管理核心场景实现了从用户认证、注册到车辆入场信息添加、出场记录维护、删除与查询的完整功能链代码结构清晰适合对照学习Swing界面与JDBC数据库交互。压缩包内共49个文件大小约1.96MB主要包含31个class编译文件、12个java源文件、1个SQL数据库脚本、jar依赖库以及运行截图和工程配置class文件可用于直接运行java源码便于修改学习SQL脚本用于初始化数据库配置齐全可导入Eclipse等IDE运行。数据库涉及admin与car两张表环境要求JDK1.8与MySQL8.0.13配套的SQL脚本可省去从零建库的麻烦便于本地快速调试。已有467人浏览学习该项目资源内的运行截图和完整目录结构能帮助读者快速理解桌面端车辆管理系统的实现思路适合作为课程设计或入门项目的参考模板。1. 先说清楚这套 javaswing 停车场管理系统到底帮你解决了什么做课设或者毕设的同学十有八九在数据库课程设计这一步卡过题目要求做“停车场管理系统”网上搜出来的要么是 SSH 全家桶看不懂要么是纯控制台程序没法交差。这套基于 Java Swing MySQL 的停车场管理系统正好卡在“有图形界面、能连数据库、代码量适中”这个最舒服的位置上。它的功能很直白用户登录注册、车辆入场登记、出场登记、信息查询和删除两张表admin、car就把核心业务串起来了。适合正在做 Java 课设、或者想快速看懂 Swing JDBC MySQL 三者怎么协作的同学也适合想拿现成项目改一改就交作业的人。我拆完这个包之后说句实话它不炫技但作为起步模板非常稳踩坑点基本都集中在环境配置上代码本身逻辑很顺。2. 功能模块与数据库设计先看明白这两张表和几条核心链路2.1 admin 表与用户登录注册的完整校验逻辑这套系统把登录和注册做在了同一个入口里。admin 表存的是用户账号信息典型的字段设计就是id、username、password这三个注册时往表里插一条记录登录时按用户名查出来比对密码。这个逻辑本身不复杂但它是整个系统的门面值得拆开看。我打开 src 目录下的代码登录部分的实现基本就是走 JDBC 标准流程加载驱动、建立连接、执行 SQL、比对结果。抽出核心代码大概是这样的// LoginDAO.java 登录校验核心方法 public boolean checkLogin(String username, String password) { // 1. 通过 DBUtil 获取数据库连接 Connection conn DBUtil.getConnection(); PreparedStatement ps null; ResultSet rs null; try { // 2. 参数化查询避免拼接 SQL String sql SELECT * FROM admin WHERE username ? AND password ?; ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); rs ps.executeQuery(); // 3. 只要有一条匹配记录就算登录成功 return rs.next(); } catch (SQLException e) { e.printStackTrace(); return false; } finally { // 4. 释放资源 DBUtil.close(rs, ps, conn); } }这里有几个细节值得注意。PreparedStatement的?占位符是标准写法能挡掉一部分 SQL 注入风险这是课设评分时老师会看的点。DBUtil.getConnection()和DBUtil.close()是封装好的工具类关闭资源按ResultSet → PreparedStatement → Connection的顺序这个顺序如果写反了MySQL 连接数会在长时间运行后被耗尽系统表现为“用着用着突然点没反应”。注册逻辑比登录多一个动作——先查重再插入避免用户名重复时抛出主键冲突异常。2.2 car 表结构入场、出场、查询、删除是怎么围着它转的car 表是系统的核心业务表。字段设计上至少包含了车牌号、入场时间、出场时间这几个关键列。我在 db 目录下的脚本里看到表结构时第一反应是这确实是个标准课设级别的设计不冗余也不花哨。车辆入场流程就是往 car 表插入一条记录出场则是更新这条记录的出场时间字段。这个设计有一个隐含的好处只要出场时间为空就说明这辆车还在停车场里可以做“当前在场车辆”的筛选。给出一段车辆登记的插入操作// CarDAO.java 车辆入场登记 public boolean addCar(Car car) { Connection conn DBUtil.getConnection(); PreparedStatement ps null; try { String sql INSERT INTO car (plate_number, owner_name, car_type, enter_time) VALUES (?, ?, ?, ?); ps conn.prepareStatement(sql); ps.setString(1, car.getPlateNumber()); ps.setString(2, car.getOwnerName()); ps.setString(3, car.getCarType()); ps.setString(4, car.getEnterTime()); return ps.executeUpdate() 0; } catch (SQLException e) { e.printStackTrace(); return false; } finally { DBUtil.close(null, ps, conn); } }参数说明plate_number是车牌号建议在界面层就做格式校验owner_name是车主姓名car_type是小轿车、SUV 这类分类可以做成下拉框减少输入错误enter_time用字符串存时间格式如2025-01-15 14:30:00配合 MySQL 的NOW()函数也能写入。注意car_type这个字段目前是自由文本如果要做统计报表最好改成字典表关联但课设阶段不用纠结。删除和查询走的是另外两个 JDBC 套路。查询的核心是用LIKE做模糊匹配比如输入“京A”能查出所有以京A开头的车牌。删除则是按主键或车牌号执行 DELETE代码模式跟上面的一致只是 SQL 不同。整个模块看下来就是标准的 CRUD 四件套没有用任何 ORM 框架这在课设里反而是加分项因为老师能看到你懂原生的 JDBC 链路。2.3 数据库连接工具类JDBC MySQL 8.0 的关键配置整个项目最容易被忽略、也最容易翻车的就是 DBUtil 这个类。MySQL 8.0 和旧版本 5.x 在连接方式上有几个隐蔽差异驱动类名不同了连接 URL 必须加时区参数SSL 默认行为也变了。// DBUtil.java 数据库连接工具类 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtil { // MySQL 8.0.13 的驱动类名8.x 都是 com.mysql.cj.jdbc.Driver private static final String DRIVER com.mysql.cj.jdbc.Driver; // serverTimezone 必须显式指定否则会报时区错误 private static final String URL jdbc:mysql://localhost:3306/parking?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse; 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() { try { return DriverManager.getConnection(URL, USER, PASSWORD); } catch (SQLException e) { e.printStackTrace(); return null; } } public static void close(ResultSet rs, Statement st, Connection conn) { try { if (rs ! null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (st ! null) st.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (conn ! null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }这段代码里有三个参数值得背下来。第一个是serverTimezoneAsia/Shanghai不加它MySQL 8.0 会直接抛The server time zone value Öйú±ê׼ʱ¼ä is unrecognized的异常这串乱码是新手最容易懵的点。第二个是useSSLfalse本地开发环境没有必要走 SSL 握手加上能减少一层网络耗时和证书报错。第三个是characterEncodingutf8保证中文写入读取不乱码。USER和PASSWORD要改成你自己 MySQL 里的实际账号这里的 root/123456 只是示例。提示连接参数里没有加allowPublicKeyRetrievaltrue如果你的 MySQL 8.0 用的 caching_sha2_password 认证插件连接时可能会报Public Key Retrieval is not allowed建议在 URL 后面补上这个参数一行解决。3. 把项目跑起来JDK 1.8 MySQL 8.0.13 完整复现步骤3.1 环境准备JDK 1.8 与 MySQL 8.0 的安装校验这个项目的运行环境是 JDK 1.8 MySQL 8.0.13环境不对是跑不起来的。先说 JDK项目用的是 Java 8 的语法特性如果你机器上装的是 JDK 17 甚至更高版本编译可能能过但 Swing 的某些渲染行为和系统兼容性反而会出怪问题。建议老老实实装 JDK 8。安装完 JDK 后第一件事是配置 JAVA_HOME 环境变量。在 Windows 系统变量里新建JAVA_HOME值指向 JDK 安装目录比如C:\Program Files\Java\jdk1.8.0_202然后把%JAVA_HOME%\bin追加到Path变量的最前面。这一步做完后打开命令行验证java -version javac -version两条命令都要有输出java和javac的版本号必须一致。如果出现了“java 有输出但 javac 提示不是内部或外部命令”基本就是Path里没有配 bin 目录或者配了但没用%JAVA_HOME%引用。一个常见的翻车场景是机器上同时装了 JDK 8 和 JDK 17java -version显示的是 17 的版本这是因为Path里 JDK 17 的 bin 目录排在前面。解决方法是把%JAVA_HOME%\bin上移到Path列表的第一个位置。MySQL 这边建议就装 8.0.13 同版本或同一个大版本的 8.0.x。安装时的坑集中在两处一是字符集要选 utf8mb4不然后面插入中文车牌或者车主姓名会报Incorrect string value错误二是认证插件MySQL 8.0 默认是caching_sha2_password项目里的驱动如果太老可能不兼容。安装过程中如果用的是网上流传的 my.ini 配置记得确认default_authentication_pluginmysql_native_password这一行被加进去了或者安装时在“Authentication Method”这一步选“Use Legacy Authentication”仅限本地学习环境。3.2 导入 Eclipse 与项目结构解读src、bin、lib 分别是什么这个压缩包解压后目录结构是标准的 Eclipse Java 工程.classpath、.project、src、bin、lib、db。.project文件是 Eclipse 识别工程类型的标志.classpath记录了源码路径、输出路径和依赖的 jar。src是源码目录bin是编译输出的 class 文件目录lib下面放着项目依赖的 jar 包。导入 Eclipse 的路径是File → Import → General → Existing Projects into Workspace然后选择解压后的根目录。这里有个常见失误很多人直接双击.java文件打开看代码而没有真正导入成工程导致后面点运行按钮时报“No main class found”。正确姿势是导入后等 Eclipse 左下角构建进度条跑完然后展开src目录找到带main方法的入口类一般在src根包或view、frame这种命名下。注意lib目录要重点检查。右键工程名 →Build Path → Configure Build Path → Libraries确认 MySQL 的 JDBC 驱动 jar比如mysql-connector-java-8.0.13.jar已经在列表里。如果导入后DBUtil类报红叉基本上就是 jar 没引用上。bin目录不需要手动管Eclipse 编译后会自动生成。补一个细节工程源码里可能要改的是数据库名。默认连接的是parking这个库如果你在 MySQL 里建的库名不一样记得同步改DBUtil里的 URL否则启动后界面能弹出来但一登录就会报数据库不存在的错。3.3 数据库初始化执行 db 脚本建库建表db目录下放的是建表脚本。在 MySQL 命令行或 Navicat 里执行一遍把数据库和两张表建出来。-- db/parking.sql 初始化脚本 CREATE DATABASE IF NOT EXISTS parking DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; USE parking; -- 管理员表用户登录注册用 CREATE TABLE admin ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL ); -- 车辆信息表 CREATE TABLE car ( id INT PRIMARY KEY AUTO_INCREMENT, plate_number VARCHAR(20) NOT NULL, owner_name VARCHAR(50), car_type VARCHAR(20), enter_time DATETIME, exit_time DATETIME ); -- 预置一个管理员账号否则首次登录没法通过 INSERT INTO admin (username, password) VALUES (admin, 123456);说明几点AUTO_INCREMENT是自增主键插入时不需要手动填 id。plate_number建议加唯一索引防止同一辆车重复入场记录这是从实际业务出发的改进原表可能没加你可以自己补上。enter_time和exit_time用DATETIME类型就好比字符串存储更规范但如果代码里是按字符串处理的JDBC 的setString往DATETIME字段写入2025-01-15 14:30:00这种格式是能正确解析的所以不改也能跑。执行完脚本后用一条查询验证表是否存在SHOW TABLES FROM parking; SELECT * FROM admin;能查到预置的 admin 记录就算建库成功。如果中文注释在命令行里显示成乱码执行SET NAMES utf8mb4;再查一次这个不影响实际使用但看数据时舒服很多。到这一步环境就齐了启动项目入口类登录界面弹出来用 admin / 123456 试一下能否进去。4. 避坑指南这几处最容易让项目当场翻车4.1 现象连接数据库报 SSL 错误Communications link failure第一次用 MySQL 8.0 跑这个项目时十个人里有八个会栽在这条报错上日志里能看到SSL connection error: 协议错误之类的内容。原因是 MySQL 8.0 默认开启了 SSL 连接而本地开发环境一般没配证书驱动在做 SSL 握手时失败。解决在DBUtil的连接 URL 末尾加useSSLfalse。完整拼出来是jdbc:mysql://localhost:3306/parking?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse。如果加了还报错看下一节时区问题这两个经常一起出现。4.2 现象登录时报时区异常The server time zone value Öйú±ê׼ʱ¼ä is unrecognized这个报错太好认了中英文混着乱码一看就是时区没指定。MySQL 8.0 的时区默认值从 5.x 的 SYSTEM 变成了更严格的校验规则JDBC 连接串里不显式声明 serverTimezone 就会爆。解决URL 里加serverTimezoneAsia/Shanghai对于中国用户这个值写死就行。也可以用serverTimezoneGMT%2B8这种形式但Asia/Shanghai更可读。如果你想在 MySQL 服务端彻底改掉默认值执行SET GLOBAL time_zone 8:00;不过这个全局变量在 MySQL 服务重启后会失效治标不治本还是改 URL 靠谱。4.3 现象ClassNotFoundException: com.mysql.jdbc.Driver项目用的是com.mysql.jdbc.Driver但你的 jar 包是 8.x 版本驱动类早就改名成com.mysql.cj.jdbc.Driver了。这个问题本质是 jar 包版本和代码里的驱动类名不匹配。解决打开DBUtil.java把Class.forName()里的类名改成com.mysql.cj.jdbc.Driver。这个类名从 MySQL Connector/J 8.0 开始启用旧类名仅为兼容保留但 IDEA 或 Eclipse 的自动补全通常只会提示新包名。如果你不希望改代码也可以去 lib 目录下找找有没有 5.1.x 版本的 mysql-connector jar但既然项目环境规定是 MySQL 8.0.13还是跟随新驱动类名更合理。4.4 现象界面能打开但登录按钮点了一下没反应分两种情况排查。第一种是控制台没有任何报错这种最诡异通常是事件监听没绑定成功检查登录按钮的addActionListener是否在init()方法里被执行到了。第二种是控制台打了一长串SQLException这种反而好办按上面 SSL 和时区两条去改 URL改完重启项目。这里多说一句我自己的经验Swing 的界面线程和数据库操作线程混在一起如果数据库连不上executeQuery会阻塞在连接阶段界面表现为“卡死”而不是“报错弹窗”。所以排查这类问题第一步永远是看控制台而不是反复点按钮。把DBUtil.getConnection()里的报错堆栈读一遍基本都能定位到 URL 参数上。4.5 现象Eclipse 编译报错提示项目使用 Java 1.8 但当前环境是更高版本Eclipse 里每个工程可以单独指定编译级别。工程导入后Project → Properties → Java Compiler里的Compiler compliance level可能被自动识别成 1.8但你系统里的 JRE 是 17两个对不上就会爆红。解决在同一个设置页里把Use default compliance settings勾上或者手动把 level 切到 1.8然后到Installed JREs里确认绑定的是 JDK 8 的安装路径。改完后Project → Clean重新编译一次红叉应该就消了。5. 二次开发思路从“课设能跑”到“简历能写”5.1 安全加固密码不能明文存SQL 不能拼接课设里 admin 表的密码是明文存储的登录校验也是明文比对这在教学场景里没问题但要写到简历上就得改两处。第一处是注册时用MessageDigest对密码做 MD5 或 SHA-256 摘要登录比对时把用户输入的密码哈希之后再查。第二处是把所有字符串拼接的 SQL 换成PreparedStatement这个项目里大部分 SQL 已经是参数化写法了但如果你发现代码里还有SELECT * FROM car WHERE plate_number plateNumber 这种一定换成?占位符。// 密码哈希工具方法 public static String md5(String input) { try { MessageDigest md MessageDigest.getInstance(MD5); byte[] digest md.digest(input.getBytes(UTF-8)); StringBuilder sb new StringBuilder(); for (byte b : digest) { // 转成十六进制字符串保证定长 sb.append(String.format(%02x, b)); } return sb.toString(); } catch (Exception e) { throw new RuntimeException(e); } }这段代码实现的是标准 MD5 哈希注册时password字段存md5(明文)登录时先把用户输入哈希再进 SQL。注意如果换用了这个方案原来的预置账号admin/123456在数据库里的密码必须也改成对应的哈希值否则登录会失败。5.2 业务增强加计费规则和车位状态可视化现在的系统只记录了入场出场时间没算费用。这是课设升级到“优秀”最容易做的一个点。思路是在exit_time写入时顺便算费用用SELECT TIMESTAMPDIFF(MINUTE, enter_time, exit_time) FROM car WHERE id ?拿到停车分钟数再按“首小时 10 元之后每小时 5 元”这种规则算钱把结果存进 car 表新增的fee字段。界面层面JTable表格加一列“状态”——根据exit_time是否为空渲染成“在场/已离场”就是车位状态的可视化雏形。再往上做可以加一个JComboBox下拉筛选“只看在场车辆”对应 SQL 的WHERE exit_time IS NULL。这两个改动加起来代码量不超过 100 行但能从“实现了增删改查”变成“有业务逻辑了”。5.3 数据校验车牌号格式和重复入场多数课设项目在界面层几乎不做校验用户在输入框里随便打什么都能入库。这里补一个低成本的正则校验车牌号一般是省份简称加字母数字比如京A12345一个通用正则可以做格式约束。// 车牌号校验省份简称 字母 数字长度约 6-8 位 public static boolean isValidPlate(String plate) { if (plate null || plate.isEmpty()) { return false; } return plate.matches(^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{4,6}$); }说明一下这个正则的结构第一个字符是中文字符集代表省份直辖市简称第二个是英文字母代表发牌机关代号第三部分是 4 到 6 位字母数字组合兼容新能源车牌的 6 位。把这个方法加到车辆入场的地方不符合就直接JOptionPane.showMessageDialog弹提示并中断入库能挡住大半的无效数据。我拆过的课设项目里十套有七八套是不做任何输入校验的。你现在花二十分钟把这个加上数据库里的脏数据会少很多答辩时也有东西可讲。最后说个我自己的习惯不管接手什么 Swing MySQL 的项目我第一件事永远是先改DBUtil把 URL 里的时区和 SSL 参数规规矩矩写上再启动程序。这看起来是小事但每次都能避开上面那几个最常见的翻车点。就像这次拆这个停车场系统环境配置花了半小时真正跑起来登录进主界面反而只用了几分钟。从那以后我每次导老项目都强制自己先看一眼.classpath和DBUtil再点运行按钮。希望帮到你。本文还有配套的精品资源点击获取
返回列表