
简介面向Java课程设计的影碟出租管理系统基于GUI/Swing与MySQL数据库实现适合正在完成课程作业、需要参考完整项目源码的初学者。系统围绕影碟信息管理、客户租赁与归还等常见业务涉及登录、注册、数据增删改查、JDBCUtils工具类封装等模块能够帮助理解Swing事件处理、数据库连接与基础业务逻辑的配合方式。资源包共49个文件大小仅153KB包含8个Java源文件、20个class编译文件、9张PNG界面图片、8个XML配置以及可直接导入的SQL数据库脚本同时附带IDEA工程标识文件便于导入开发环境后查看与运行SQL脚本涵盖建表语句和初始数据能帮助快速搭建数据库环境。目前已有136人浏览学习对于需要快速搭建课设框架、对照核心代码理解实现思路的学生来说整体结构简单清晰是一个轻量且完整的课设参考。1. 影碟出租管理系统Swing 界面与 MySQL 落地的 Java 课设样板这套影碟出租管理系统是典型的 Java 课程设计项目采用了 Swing 做桌面 GUI、MySQL 做数据持久化整体结构非常直接登录注册、影碟信息的增删改查、数据库脚本导入即用。它适合两类人一是正在做 Java 课设、需要一套能跑通又能讲清楚的设计思路的学生二是想快速理解 Swing JDBC 如何协作、数据库表怎么设计才能支撑一个完整业务流的开发者。项目本身不追求界面华丽但胜在逻辑闭环完整源码里包含Login、Register、Add、Update、Delete、SelectAll这些 Java 类配合ydcz.sql脚本导入就能启动。本文会直接把这套系统的结构、运行步骤和核心代码逻辑拆开讲你可以照着在 IDEA 或 Eclipse 里复现也能借此改写成其他管理类系统。2. 选型分析为什么是 Swing、MySQL 和 JDBC而不是别的组合2.1 Swing 在课设里的真实定位与边界做 Java 桌面应用选型无非几条路Swing、JavaFX、AWT甚至有人用SWT。但对课设来说Swing 有个其他框架比不了的优势它是 JDK 自带的不需要额外引入依赖写完直接java Main.java就能跑。JavaFX虽然界面更现代但环境配置相对繁琐在评委演示时反而容易因为 SDK 版本问题翻车。对比项SwingJavaFXAWTJDK 内置是需额外配置是控件丰富度中高低学习成本低中高低界面观感朴素现代最原始从上表能看出来Swing 在课设这种「要稳、要好讲、要好准备答辩」的场景里是最稳妥的。这套系统的界面设计也遵循了这一原则直接用JFrame、JButton、JTable等基础组件不套任何美化库这样代码量不大而且老师问起来每个控件都能说清楚。2.2 MySQL 与 JDBC 的协作方式为什么不用文件存储影碟出租的数据天然是结构化关系型数据影碟信息、客户信息、租借记录彼此之间有外键关联。如果存文件每次启动都要手动序列化和反序列化数据一致性也难保证。所以这套系统选了 MySQL配合 JDBC 驱动通过java.sql包里的DriverManager、Connection、PreparedStatement、ResultSet完成通信。核心连接代码一般长这样public class JDBCUtils { private static final String URL jdbc:mysql://localhost:3306/ydcz; private static final String USER root; private static final String PASSWORD 123456; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }这段代码里URL指向本机的ydcz数据库USER和PASSWORD对应你自己 MySQL 的账号密码。实际项目里这套系统的JDBCUtils.java还要负责注册驱动Class.forName(com.mysql.cj.jdbc.Driver)和释放资源关闭ResultSet、Statement、Connection。释放资源这一步在课设里容易被人忽略但答辩时老师特别喜欢问所以哪怕代码里只是简单调用也要在思路里理清楚。2.3 数据库脚本ydcz.sql的结构设计打开ydcz.sql里面应该包含建库、建表和初始数据插入语句。常见的设计是有影碟表包含编号、片名、类型、租金、库存、用户表账号、密码、角色。这种设计能支撑基本业务注册登录后操作员可以新增影碟、修改信息、删除记录、查询全部列表。CREATE DATABASE IF NOT EXISTS ydcz DEFAULT CHARSET utf8; USE ydcz; CREATE TABLE dvd ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, genre VARCHAR(50), price DOUBLE, stock INT ); CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(50) NOT NULL );这里要注意user表的名字在某些 MySQL 版本里是保留字容易出问题。实际项目里如果遇到导入报错一般会改成t_user或者加反引号。这也是课设里一个典型的「能跑但不够严谨」的点我们在后面排错章节会细讲。3. 部署与运行从 SQL 脚本导入到 IDEA 里跑出第一个窗口3.1 MySQL 环境准备和脚本导入步骤先确保电脑上装了 MySQL。建议用 5.7 或 8.0 版本安装时记住 root 密码。打开命令行工具登录 MySQLmysql -u root -p输入密码后直接执行 SQL 脚本source C:/path/to/ydcz.sql;如果路径里有空格用绝对路径加上双引号即可。执行完可以用一句命令验证表是否创建成功USE ydcz; SHOW TABLES;能看到dvd和user等表说明导入成功。如果source命令报错常见的坑有两个一个是 SQL 文件里带了CREATE DATABASE但当前用户权限不够另一个是文件路径写成了反斜杠MySQL 里要改成/或者\\。3.2 IDEA 或 Eclipse 中的导入与配置打开 IntelliJ IDEA选择File - New - Project from Existing Sources选中解压后的源码目录IDEA 会自动识别为 Java 项目。这里需要确认两个东西Project SDK用的是 JDK 8 及以上Language Level设为 8避免语法兼容问题接下来要导入 MySQL JDBC 驱动。如果用的是 Maven 项目可以在pom.xml里加dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency但原项目不是 Maven是普通 Java 工程所以要在Project Structure - Libraries里手动把mysql-connector-java-xxx.jar加进去。这个 jar 包需要自己去 MySQL 官网下载或者通过 Maven 仓库拉下来。加好后运行Main.java如果界面弹出来说明环境已经通了。3.3 数据库连接参数和本地环境匹配运行前必须检查JDBCUtils.java里的连接参数和自己本地 MySQL 是否一致。很多同学照着源码跑点击登录按钮后程序就卡住十有八九是这里的问题private static final String URL jdbc:mysql://localhost:3306/ydcz?useSSLfalseserverTimezoneAsia/Shanghai;注意 URL 里必须要带上serverTimezone参数因为 MySQL 8.0 默认的时区跟国内差了 8 小时不加会报The server time zone value的错误。useSSLfalse是为了避免本机开发时 SSL 握手警告。这两个参数是常见坑改了密码记得同步改PASSWORD。4. 核心代码模块实现登录、注册与增删改查的套路4.1 登录验证的逻辑链从按钮事件到 SQL 查询打开Login.java登录按钮的监听器里一般会做这几件事获取输入框的账号密码、拼接 SQL 查询、比对结果、跳转主界面。这里最关键的写法是使用PreparedStatement而不是Statement原因后面细讲。核心代码结构如下String sql SELECT * FROM user WHERE username ? AND password ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { JOptionPane.showMessageDialog(null, 登录成功); } else { JOptionPane.showMessageDialog(null, 账号或密码错误); }这段代码的业务逻辑很简单把文本框里的username和password填充到 SQL 对应的占位符里执行查询。如果ResultSet里有数据说明账号密码匹配否则提示错误。setString方法特别好的一点是自动处理了引号转义避免了输入 or 11这类 SQL 注入字符串导致认证被绕过的问题。4.2 注册功能与数据重复校验Register.java的实现思路是先检查用户名是否已存在再决定是否插入新记录。这里最常见的做法是两步查询String checkSql SELECT * FROM user WHERE username ?; PreparedStatement ps conn.prepareStatement(checkSql); ps.setString(1, username); ResultSet rs ps.executeQuery(); if (rs.next()) { JOptionPane.showMessageDialog(null, 用户名已被使用); return; } String insertSql INSERT INTO user (username, password) VALUES (?, ?); PreparedStatement insertPs conn.prepareStatement(insertSql); insertPs.setString(1, username); insertPs.setString(2, password); int result insertPs.executeUpdate(); if (result 0) { JOptionPane.showMessageDialog(null, 注册成功); }这个流程里executeUpdate返回的 int 是影响行数只要大于 0 说明插入成功。注意这里两次连接使用的是同一个Connection对象需要从外部传入或每次重新获取但事务的一致性其实没有严格保证。理想场景下应该用事务包裹这两个操作避免中间环节断掉导致数据不一致。不过课设能跑到这一步已经是及格分。4.3 影碟列表展示与增删改查的封装SelectAll.java的作用是把数据库里的影碟记录全部拉出来放到JTable中显示。这部分的难点不是 SQL而是怎么把ResultSet的行数据塞给表格模型。常规做法是用DefaultTableModelDefaultTableModel model new DefaultTableModel(); model.addColumn(ID); model.addColumn(片名); model.addColumn(类型); model.addColumn(租金); model.addColumn(库存); String sql SELECT * FROM dvd; Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(sql); while (rs.next()) { model.addRow(new Object[]{ rs.getInt(id), rs.getString(title), rs.getString(genre), rs.getDouble(price), rs.getInt(stock) }); } table.setModel(model);addRow的参数是一个 Object 数组顺序要和表头对齐。这里的rs.getInt和rs.getString是按列名取值比按下标取值可读性高很多改表结构时不容易错。4.4 新增、修改、删除的 SQL 参数化实现Add.java通常是弹出一个JDialog输入片名、类型、租金、库存后点击保存。Update.java则是先选中表格某行把数据回显到对话框里再更新。Delete.java就是拿选中行的 ID 执行DELETE。常见写法如下String sql DELETE FROM dvd WHERE id ?; PreparedStatement ps conn.prepareStatement(sql); ps.setInt(1, id); int rows ps.executeUpdate(); if (rows 0) { JOptionPane.showMessageDialog(null, 删除成功); }这里用setInt处理数字参数避免类型不匹配。需要注意的一点是前端的表格里 ID 列通常是显示出来供人识别的但删除操作最好用隐藏的 ID 值而不是用文本匹配否则容易误删同名影碟。这类细节体现了代码有没有工程意识答辩时讲出来会很加分。5. 进阶技巧PreparedStatement 安全边界的验证与课设排错清单5.1 参数化查询为什么能防住 SQL 注入上一节提到了PreparedStatement能防 SQL 注入但只知道结论是不够的得能现场演示和讲解。它的核心原理是 SQL 语句的结构在数据库端预先编译传入的参数只被当作纯文本处理不再参与语法解析。也就是说用户输入的任何字符串内容哪怕包含单引号、分号、注释符都不会改变 SQL 指令的语义。输入内容使用 Statement 拼接后的效果使用 PreparedStatement 的效果admin OR 11条件恒真登录被绕过被当成密码字符串匹配失败1; DROP TABLE dvd;可能连续执行两条 SQL整段被视为参数值报错但不破坏数据在答辩现场可以把这两种情况在代码里切换演示对比效果非常直观。但要注意PreparedStatement 也不是万能安全罩如果表名、列名需要动态拼接那部分仍然要防御性地检查白名单。这套系统里没有这种场景所以不做展开。5.2 MySQL 脚本导入失败与中文乱码的排查顺序这是课设里被问得最多的两个问题。先看乱码如果ydcz.sql里含中文注释或中文数据导入时要用--default-character-setutf8选项或者在 SQL 文件头部加SET NAMES utf8mb4;如果dvd表里插入的中文显示成了???先查表字符集SHOW CREATE TABLE dvd;看到CHARSETutf8就改成utf8mb4因为utf8mb4是utf8的超集能覆盖更多字符。然后是导入失败问题最常见的是source命令找不到文件或者权限不足。解决办法是在 MySQL 命令行里先执行USE ydcz;再用source确保表创建在当前数据库。如果提示Unknown database说明CREATE DATABASE没有被执行手动建一下库再导入即可。5.3 Swing 界面卡顿的轻量修复方案这套系统在数据量小几百条时完全流畅但如果影碟表数据量涨到几万条SelectAll里一次性查全部再addRow就会让界面明显卡顿。可以用SwingWorker把查询放到后台线程查询完成后再刷新JTable避免阻塞 EDTEvent Dispatch Thread。不过这个技巧课设里用不用都行讲了反而是加分项。SwingWorkerVoid, Object[] worker new SwingWorker() { Override protected Void doInBackground() { try (Connection conn JDBCUtils.getConnection(); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT * FROM dvd)) { while (rs.next()) { publish(new Object[]{rs.getInt(id), rs.getString(title)}); } } catch (SQLException e) { e.printStackTrace(); } return null; } Override protected void process(ListObject[] chunks) { for (Object[] row : chunks) { model.addRow(row); } } }; worker.execute();doInBackground里执行耗时查询publish方法分批发送中间结果process在 EDT 上接收并更新表格。这样界面不会变成「未响应」状态。5.4 课设答辩前的自检清单最后给一套快速自查的验证路径登录窗口输入错误密码看是否提示输入admin OR 11验证是否被拦截注册一个新账号再登录新增一张影碟、修改租金、删除记录然后重启系统确认落库打开ydcz库里的表观察数据变化。每一步都走通课设演示基本就稳了。本文还有配套的精品资源点击获取