从JDBC到Swing:Java初学者实现商品管理系统的完整工程路线
简介这是一份基于Java JDBC与MySQL数据库并结合Java Swing图形界面实现商品管理系统的完整工程包主要面向高校大二、Java初学者以及需要课程设计与数据库开发练手的人群。压缩包共18个文件大小仅16KB主体为10个Java源代码文件涵盖数据库连接、DAO数据访问、Service业务处理、Controller控制层以及UI界面等分层结构另有6个XML配置文件和少量工程配置便于导入集成开发环境后直接运行学习。资源虽小但代码分层清晰适合用于理解JDBC操作流程、SQL增删改查以及Swing组件布局与事件处理的完整配合亦有助于掌握小型管理系统的模块划分思路。已有1953人学习使用是快速上手Java桌面应用与MySQL交互的不错参考。1. 为什么说这是Java初学者最该完整跑通的商品管理系统很多读者把 Java 学到“控制台 CRUD 全会界面一加就乱”这一步就卡住了JFrame 建得出来但数据和表格对不上JDBC 连得上但一关窗口就连接泄漏按钮一多代码全堆在事件方法里。这个标题讲的正是一条常用的补课路线——用 JDBC 连数据库用 Swing 做图形界面把一个商品管理系统从空窗体做到“能增删改查、能登录、能入库展示”。它不是炫技项目但它是 Java SE 阶段极少能把数据库访问、界面事件、异常释放三件事同时逼你练熟的项目。适合期末设计、自我练手也适合从“Java 语法会了”到“做出完整程序”之间那一段路的读者。2. JDBC连接数据库驱动选型、URL参数与最小连接代码2.1 数据库版本与驱动先确认你用的是哪一代驱动商品管理系统最常见的数据落点就是 MySQL 数据库JDBC 驱动也几乎绕不开官方提供的 Connector/J。新手最容易在第一步就翻车网上教程一搜一大把代码开头还是Class.forName(com.mysql.jdbc.Driver)而新版驱动类的全限定名已经变成了com.mysql.cj.jdbc.Driver。两个名字差一个cj但针对的驱动版本完全不同。老写法在 MySQL 5.x 时代没问题放到 MySQL 8.x 和配套的 Connector/J 8.x 上运行时会直接抛ClassNotFoundException。接这个项目的时候我一般会先确认三件事数据库服务端的版本、驱动 jar 的版本、Java 的编译级别。常见组合是 MySQL 8.x Connector/J 8.x JDK 8 及以上这个组合在课程设计和实际小型工具里都足够稳。驱动的 jar 包不需要单独下载到系统目录把它放进项目的lib目录然后在 IDE 里执行“Add as Library”比乱改环境变量省心得多。驱动加载的关键代码其实就一段写在一个静态块里最合适保证整个应用只加载一次import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * 数据库连接工具类 * 静态块负责加载驱动之后 getConnection() 统一创建连接 */ public class DBUtil { static { try { // 注意 8.x 驱动必须是 com.mysql.cj.jdbc.Driver Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(MySQL驱动加载失败请检查lib目录下的jar包); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }这段代码的逻辑很简单静态块在类第一次被加载时执行Class.forName把驱动类注册到DriverManager。如果 jar 包缺失或者驱动类名写错异常会在初始化阶段立刻暴露而不是拖到第一次查数据库才崩。把URL、USER、PASSWORD定义成常量时建议写在单独的配置类里后面统一替换。2.2 最小连接代码注册、建连、执行、关闭的顺序很多读者把“能连上数据库”理解为“写一行getConnection就行”其实 JDBC 有四个环节必须遵守固定顺序加载驱动、获取连接、执行 SQL、释放资源。前两步刚才已经看到了这里补上查询和关闭的完整写法。资源关闭的顺序和创建顺序正好相反先关ResultSet再关Statement最后关Connection而且必须放在finally里保证异常发生时也能执行到。public ListGoods listAllGoods() { String sql SELECT id, name, price, stock FROM goods ORDER BY id; ListGoods list new ArrayList(); Connection conn null; PreparedStatement ps null; ResultSet rs null; try { conn DBUtil.getConnection(); ps conn.prepareStatement(sql); rs ps.executeQuery(); while (rs.next()) { Goods g new Goods(); g.setId(rs.getInt(id)); g.setName(rs.getString(name)); g.setPrice(rs.getBigDecimal(price)); g.setStock(rs.getInt(stock)); list.add(g); } } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭顺序必须与创建顺序相反 if (rs ! null) { try { rs.close(); } catch (SQLException ignored) {} } if (ps ! null) { try { ps.close(); } catch (SQLException ignored) {} } if (conn ! null) { try { conn.close(); } catch (SQLException ignored) {} } } return list; }这段代码有两点值得说明。第一用PreparedStatement而不是Statement好处是可以预编译 SQL也能防止商品名称里带单引号时把语句拼坏。第二finally里的关闭要一个一个包裹 try-catch不能图省事写在一行里因为前面一个关闭失败会让后面所有关闭都跳过。连接泄漏是 Swing 项目最常见的隐性 bug表面看不出来程序运行一段时间后就会报Too many connections。2.3 连接URL的三个必调点时区、SSL和字符集连接 URL 的写法看着像配置其实每个参数背后都是一个具体的报错场景。最常见的完整 URL 是这样jdbc:mysql://localhost:3306/shop?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8useUnicodetrue第一个参数serverTimezone不设MySQL 8.x 连接时大概率报 The server time zone value 本文还有配套的精品资源点击获取