ARTICLE DETAIL

资讯详情

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

JavaSwing+MySQL+JDBC人事管理系统课程设计实战全解

JavaSwing+MySQL+JDBC人事管理系统课程设计实战全解 简介这是一套基于Java Swing、MySQL与JDBC的人事管理系统面向正在完成数据库课程设计或学习Java桌面应用开发的人群。系统包含完整项目源码、运行界面截图与数据库脚本覆盖员工信息管理、部门设置、考勤统计等常见业务模块有助于理解Swing界面布局、JDBC数据库连接、SQL增删改查等核心技术。资源共24个文件其中11个Java源文件为核心业务代码12张PNG图像对应用户界面和功能演示1个SQL脚本用于初始化数据库表结构压缩包整体仅143KB体量轻量但结构完整。目前已有3878人下载学习适合用于课设参考、毕业设计基础或快速入门JavaMySQL开发。由于不同MySQL版本引起的启动类报错多为基础配置问题可自行排查解决整体代码注释清晰方便二次开发与功能扩展。1. 这题目不是做个窗口交作业那么简单JavaSwingMySQLJDBC组合的真实分量期末拿到任务书时很多人以为这就是写个界面连个库增删改查一遍就完事。真正动手才发现JavaSwingMySQLJDBC这套组合放到人事管理系统里是把桌面GUI、关系型数据库、SQL语法、事务控制、结果集映射全部串起来的完整链路。你在实验室点几下鼠标容易但要让界面上的数据和MySQL里真实落盘的数据保持同步中间隔着的不是一句连上数据库而是驱动加载、URL参数、连接生命周期、PreparedStatement、结果集转对象、界面刷新这一整条链路。这篇就按我从需求建模到答辩演示的完整顺序讲。适合三类人正在做数据库课程设计的学生、想用桌面程序练手JDBC的初学者、以及被界面做好了但数据死活写不进去卡住的人。你不会拿到什么花哨框架就是最基础、最稳的SwingJDBC直连MySQL方案代码能直接抄坑都是踩过的。2. 先把人事系统的表和关系定清楚建模是课程设计的第一道坎很多人一上来就写代码界面画了一半才发现少个字段、多个外键返工成本极高。做人事管理系统第一步永远是理清楚这个系统到底管哪些数据、数据之间什么关系。我见过太多作业把员工信息和部门信息塞进一张表里部门改名要逐行UPDATE这就是建模没做好。数据库课程设计的评分点里E-R图和数据字典的权重往往比界面高。2.1 功能边界把增删改查落到具体人事场景上人事管理系统听起来大而全实际上作为课程设计核心功能收敛到四块就够了部门维护、员工信息维护、调薪记录、按条件查询统计。这四块恰好覆盖了数据库课程的核心考点——单表增删改查、多表关联查询、聚合函数、排序、事务。不要一上来就想要考勤、排班、绩效那些会让你的表结构膨胀到难以收场。课程设计答辩时间一般就10到15分钟与其铺开一堆没做完的功能不如把核心链路做完整。我的做法是先列一份功能用例表对着建表后面写代码时心里特别有底。功能模块操作类型涉及的SQL要点部门管理增、删、改、查部门名唯一约束删除前判断是否有在职员工员工管理增、删、改、查工号唯一外键关联部门按姓名/工号模糊查询调薪管理增、查改员工基本工资记录调薪前后金额统计报表查按部门统计人数、平均工资按入职时间排序这样划分之后每张表、每个方法都有明确的归属代码不会越写越乱。数据库课程设计评分时最看重的是你的系统完整走通一个业务闭环而不是功能数量。2.2 三张核心表的建表SQL员工、部门、调薪记录人事管理系统最经典的表结构是三张表一张部门表、一张员工表、一张调薪记录表。第三张表不是必选项但它能把你和只做了单表CRUD的同学明显区分开因为它的数据来自UPDATE操作的历史留痕需要用到外键关联和事务。-- 建库时统一字符集这个习惯能少踩一半中文乱码的坑 CREATE DATABASE hrms DEFAULT CHARACTER SET utf8mb4; -- 部门表 CREATE TABLE department ( dept_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 部门编号, dept_name VARCHAR(50) NOT NULL UNIQUE COMMENT 部门名称唯一约束防止脏数据, manager VARCHAR(20) COMMENT 部门经理姓名 ); -- 员工表 CREATE TABLE employee ( emp_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 员工内部编号, emp_no VARCHAR(20) NOT NULL UNIQUE COMMENT 员工工号业务上唯一, name VARCHAR(20) NOT NULL COMMENT 姓名, gender CHAR(1) DEFAULT 男 COMMENT 性别, dept_id INT COMMENT 所属部门编号, position VARCHAR(30) COMMENT 岗位名称, hire_date DATE COMMENT 入职日期, salary DECIMAL(10,2) DEFAULT 0 COMMENT 当前基本工资mysql设置默认值为0, phone VARCHAR(20) COMMENT 联系电话, status TINYINT DEFAULT 1 COMMENT 在职状态1在职 0离职, CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES department(dept_id) ); -- 调薪记录表用来留痕 CREATE TABLE salary_change ( id INT PRIMARY KEY AUTO_INCREMENT, emp_id INT NOT NULL, old_salary DECIMAL(10,2) NOT NULL, new_salary DECIMAL(10,2) NOT NULL, change_date DATE NOT NULL, reason VARCHAR(100) COMMENT 调薪原因, CONSTRAINT fk_emp FOREIGN KEY (emp_id) REFERENCES employee(emp_id) );这个建表脚本有几个细节对后面写JDBC影响很大。第一所有字符字段没有显式指定字符集直接继承库的utf8mb4这样连接参数里只要统一编码就不会出现中文乱码。第二employee表用emp_id做物理主键、emp_no做业务唯一键这是很多课程设计容易搞混的地方——用工号当主键虽然能用但工号一旦需要修改外键和关联数据全部要跟着动。第三salary字段DEFAULT 0避免了插入员工时忘记填工资导致NULL金额的问题。2.3 给数据字典配一份初始化数据后面调试效率翻倍建完表先别急着写代码花10分钟做两件事写一份数据字典文档插入一批贴近实际的模拟数据。数据字典不用太复杂一张Markdown表格列清字段名、类型、约束、含义即可答辩时老师问你为什么给gender加默认值你能直接答出来就好。模拟数据的技巧是让数据分布有一点区分度。比如三个部门各有5到8名员工入职日期分布在2020到2024年工资从5000到15000都有。这样后面做查询统计时结果一眼就能看出对错。常见做法是直接准备一个init_data.sql当前后跑了很多次、数据乱掉时执行一遍就能恢复干净状态。这是我做过最后悔药的设计——没有当时把重置脚本存下来后面测试时只能一条条DELETE特别浪费时间。INSERT INTO department (dept_name, manager) VALUES (技术部, 张伟), (市场部, 李娜), (人事部, 王强); -- 插入员工时只写必填字段salary自动取默认值0 INSERT INTO employee (emp_no, name, gender, dept_id, position, hire_date, phone) VALUES (E001, 赵宇, 男, 1, Java开发, 2021-03-15, 13800001111), (E002, 孙丽, 女, 2, 市场专员, 2022-07-01, 13800002222), (E003, 周明, 男, 3, 招聘专员, 2020-11-23, 13800003333);插入数据时特意只写了部分字段就是为了验证建表时设置的DEFAULT 0和DEFAULT 1是否生效。查询时如果看到salary显示0.00而不是NULL说明表结构没问题。这个细节在答辩时主动提一句老师会认为你真的理解了约束的作用而不是只会照抄建表语句。3. 用JDBC把Swing和MySQL连通连接参数与DAO封装表结构定好接下来是最核心的环节——JDBC。这一章能不能写明白直接决定你后面Swing界面有没有数据可用。很多同学的翻车点不在界面代码而在JDBC这一层驱动类名写错、时区报错、连接不关闭导致数据库卡死。我会把连接工具类、DAO封装、防SQL注入一次讲清楚。3.1 驱动与URLMySQL 8和旧驱动之间最大的坑现在的课程设计环境基本都是MySQL 8.0以上对应的JDBC驱动类名是com.mysql.cj.jdbc.Driver不是老教程里那个com.mysql.jdbc.Driver。如果你用的是MySQL 8.0却拿老驱动硬连ClassNotFoundException会直接让你卡死在第一步。连接URL的写法也需要配套。MySQL 8的JDBC URL至少要关注四个参数useSSL、serverTimezone、characterEncoding、rewriteBatchedStatements。第一次连不上时九成是时区或者SSL的报错URL里把这几个参数补齐后面能省很多事。import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DbUtil { // 本机默认端口3306数据库名hrmsutf8mb4 private static final String URL jdbc:mysql://localhost:3306/hrms ?useSSLfalse serverTimezoneAsia/Shanghai characterEncodingutf8 rewriteBatchedStatementstrue; private static final String USER root; private static final String PASSWORD 你的密码; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(MySQL驱动加载失败检查是否把mysql-connector的jar包放进了lib目录); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(ResultSet rs, Statement stmt, Connection conn) { if (rs ! null) { try { rs.close(); } catch (SQLException ignored) {} } if (stmt ! null) { try { stmt.close(); } catch (SQLException ignored) {} } if (conn ! null) { try { conn.close(); } catch (SQLException ignored) {} } } }这个工具类里静态代码块只做一次驱动注册后续每次通过getConnection()获取连接。close方法的重载很有必要因为某些查询只需要关闭ResultSet和Statement不需要关闭Connection比如你使用连接池时。参数说明useSSLfalse是因为本地开发不需要加密连接省掉握手开销也不会有公钥检索的报错serverTimezoneAsia/Shanghai解决MySQL 8默认时区与美国时区不一致导致的日期时间偏移characterEncodingutf8和库表的utf8mb4配套保证中文不乱码rewriteBatchedStatementstrue是给后面的批量插入加速的没有它JDBC的批量提交会退化成逐条执行。3.2 用PreparedStatement替代Statement一个反直觉的必改项课程设计的评分标准里有一条隐蔽的加分点防SQL注入。如果你还在用Statement拼接字符串老师只要在搜索框输入一个单引号就能让你的查询直接抛异常现场演示翻车。public ListEmployee searchEmployees(String keyword) { String sql SELECT e.emp_id, e.emp_no, e.name, e.gender, d.dept_name, e.position, e.hire_date, e.salary, e.phone FROM employee e LEFT JOIN department d ON e.dept_id d.dept_id WHERE e.status 1 AND (e.name LIKE ? OR e.emp_no LIKE ?) ORDER BY e.emp_id DESC; ListEmployee list new ArrayList(); // try-with-resources自动关闭不用手写finally try (Connection conn DbUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { String like % keyword %; ps.setString(1, like); ps.setString(2, like); try (ResultSet rs ps.executeQuery()) { while (rs.next()) { Employee emp new Employee(); emp.setEmpId(rs.getInt(emp_id)); emp.setEmpNo(rs.getString(emp_no)); emp.setName(rs.getString(name)); emp.setDeptName(rs.getString(dept_name)); emp.setSalary(rs.getBigDecimal(salary)); list.add(emp); } } } catch (SQLException e) { e.printStackTrace(); } return list; }为什么用LIKE ?而不是直接LIKE % keyword %原因在于PreparedStatement的预编译机制。参数通过setString传入后MySQL会把参数当作纯数据而非SQL语句的一部分单引号、反斜杠统统失去解释能力。这个查询用了LEFT JOIN是因为有些员工可能暂时没有分配部门内连接会直接丢行。这里还演示了ORDER BY e.emp_id DESC让新员工排在最上面比默认的自增主键升序更贴近人事管理的实际使用习惯。3.3 新增、修改、删除的基本写法事务留到调薪时用增删改的SQL本身不复杂但有两个细节容易在课程设计里翻车。第一个是返回自增主键第二个是UPDATE语法中要特别注意WHERE条件漏了WHERE或者写错字段名就可能把整张表的数据全改掉。public boolean addEmployee(Employee emp) { String sql INSERT INTO employee (emp_no, name, gender, dept_id, position, hire_date, salary, phone) VALUES (?, ?, ?, ?, ?, ?, ?, ?); try (Connection conn DbUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, emp.getEmpNo()); ps.setString(2, emp.getName()); ps.setString(3, emp.getGender()); ps.setObject(4, emp.getDeptId() null ? null : emp.getDeptId()); ps.setString(5, emp.getPosition()); ps.setDate(6, emp.getHireDate() null ? null : java.sql.Date.valueOf(emp.getHireDate())); ps.setBigDecimal(7, emp.getSalary()); ps.setString(8, emp.getPhone()); return ps.executeUpdate() 1; } catch (SQLException e) { e.printStackTrace(); return false; } }注意第4个参数的写法setObject对于外键字段可以安全地处理NULL值。如果员工录入界面里部门是未选择状态直接传null是不会报错的。executeUpdate的返回值表示受影响的行数这个值要么是1要么是0可以用来判断插入是否成功不用再去查一遍数据库。修改员工信息的SQL和插入的区别就在于字段多了一个WHERE emp_id ?这是mysql update语法的标准姿势先确认主键条件再执行SET赋值。删除员工建议用逻辑删除把status从1改成0而不是物理DELETE这样历史调薪记录的外键不会断裂。逻辑删除的SQL是UPDATE employee SET status 0 WHERE emp_id ?表面是更新实际是删。这个设计在答辩时讲出来老师会觉得你考虑到了数据完整性加分明显。4. Swing界面这样写从主窗体到员工数据表格有人觉得Swing是老古董但课程设计恰恰要求用桌面程序展示你对事件驱动模型的理解。Swing的布局管理器、事件监听、JTable表模型这些东西放到JavaWeb项目里对应的就是页面组件和事件绑定底子是相通的。界面不需要多华丽但操作路径必须顺畅打开程序看到主窗体左边部门导航中间员工列表上面工具栏放按钮。4.1 主窗体的布局策略用BorderLayout稳住骨架主窗体我推荐用BorderLayout这是Swing里最稳的骨架布局。NORTH放操作工具栏CENTER放JTable的滚动面板SOUTH放状态栏显示共查询到X条记录。左右两侧的导航属于加分项有时间就加没时间不加也不影响核心功能。public class MainFrame extends JFrame { private JTable table; private DefaultTableModel model; private JTextField searchField; public MainFrame() { setTitle(人事管理系统); setSize(900, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // 顶部工具栏查询框 按钮 JPanel toolBar new JPanel(); searchField new JTextField(12); JButton searchBtn new JButton(查询); JButton addBtn new JButton(新增员工); toolBar.add(new JLabel(姓名/工号:)); toolBar.add(searchField); toolBar.add(searchBtn); toolBar.add(addBtn); // 员工表格区域显示8列数据 model new DefaultTableModel( new String[]{编号, 工号, 姓名, 性别, 部门, 岗位, 入职日期, 工资}, 0); table new JTable(model); table.setRowHeight(25); JScrollPane scrollPane new JScrollPane(table); // 状态栏 JLabel statusLabel new JLabel(就绪); add(toolBar, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); add(statusLabel, BorderLayout.SOUTH); // 查询按钮的事件调用DAO并刷新表格 searchBtn.addActionListener(e - refreshTable()); refreshTable(); } private void refreshTable() { String keyword searchField.getText().trim(); EmployeeDao dao new EmployeeDao(); ListEmployee list dao.searchEmployees(keyword); model.setRowCount(0); for (Employee emp : list) { model.addRow(new Object[]{ emp.getEmpId(), emp.getEmpNo(), emp.getName(), emp.getGender(), emp.getDeptName(), emp.getPosition(), emp.getHireDate(), emp.getSalary() }); } } }很多人第一次写Swing时会犯一个毛病直接在构造方法里把界面上所有组件、监听器、数据加载逻辑全写在一起代码能跑但答辩时讲不清。上面的写法把创建组件和刷新数据分开了。refreshTable()这个方法独立出来后面新增、删除、修改完员工只要重新调用它表格就自动刷新。4.2 JTable的数据刷新setRowCount(0)是最关键的后悔药JTable的坑不在创建而在刷新。刚学Swing时我习惯用table.updateUI()来刷新结果翻车了——界面不动数据不变。后来才明白JTable显示的是DefaultTableModel这个黑匣子里的数据你必须操作model而不是操作table。model.setRowCount(0)这行是清空表格所有行。如果不先清空直接addRow查询一次追加一次第二次搜索出来的结果会叠在第一次后面表格越查越长数据混乱。正确顺序永远是先清空再遍历结果集逐行添加。这里还需要注意一点addRow传入的Object数组长度必须和表头列数一致多一个或少一个都会导致运行时异常。如果遇到点击查询后表格没反应先别怀疑数据库先看model.setRowCount(0)有没有被执行再看list.size()是不是0。我一般会在refreshTable()里临时打印一行系统输出看到SQL查到了几条记录再判断是DAO层的问题还是界面刷新逻辑的问题。4.3 新增和编辑员工弹窗表单的数据回填与提交新增和编辑的逻辑非常像区别只在编辑时要把选中行的数据回填到表单里。这里用同一个弹窗类通过构造函数传入要编辑的Employee对象传null表示新增传对象表示编辑。public class EmployeeDialog extends JDialog { private JTextField nameField, salaryField, phoneField; private JComboBoxString deptBox; private JComboBoxString genderBox; private Employee result; // 提交后的员工对象 public EmployeeDialog(Frame owner, Employee editEmp) { super(owner, editEmp null ? 新增员工 : 编辑员工, true); // 表单初始化略去 if (editEmp ! null) { nameField.setText(editEmp.getName()); salaryField.setText(editEmp.getSalary().toString()); phoneField.setText(editEmp.getPhone()); deptBox.setSelectedItem(editEmp.getDeptName()); genderBox.setSelectedItem(editEmp.getGender()); } // 确定按钮 JButton okBtn new JButton(保存); okBtn.addActionListener(e - { // 基本校验姓名和工资不能为空 if (nameField.getText().trim().isEmpty()) { JOptionPane.showMessageDialog(this, 姓名不能为空); return; } result new Employee(); result.setName(nameField.getText().trim()); result.setSalary(new BigDecimal(salaryField.getText().trim())); result.setPhone(phoneField.getText().trim()); dispose(); }); } }工资输入框的校验建议正反各做一个正面判断能不能转成BigDecimal反面判断是否小于0。别小看这个校验老师演示时如果输入一个负数你的系统要么报错要么存入负工资现场印象分会大打折扣。弹窗设计成模态对话框第三个参数传true关闭前用户无法操作主窗体这是桌面程序的标准交互。新增和编辑共用一个弹窗还有一层好处代码量小逻辑集中后面要加字段只改一处。下拉框部门列表的加载可以放在弹窗打开时从数据库查询也可以在主窗体初始化时查一次缓存起来课程设计规模下直接查库即可不需要引入缓存机制。5. 人和数据库之间最常见的5个翻车现场避坑清单这一章是血泪经验的汇总。我把自己和身边同学踩过的坑按现象→原因→解决整理出来每一个都对应一个具体的报错信息或异常表现。遇到问题时直接按图索骥比自己瞎试快得多。5.1 驱动加载报ClassNotFoundException但jar包明明放好了现象运行程序时控制台抛出java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver检查过jar包确实在项目的lib目录里Build Path也加进去了。原因有两层。一层是MySQL版本和驱动版本不匹配MySQL 8必须用mysql-connector-java 8.x的驱动里面的类名是com.mysql.cj.jdbc.Driver而不是旧版的com.mysql.jdbc.Driver。另一层是Eclipse的模块化机制即使Build Path加了jar包运行时也可能找不到需要确认Modulepath和Classpath的归属是否正确。解决把驱动jar包放入项目的lib目录后右键Build Path → Add to Build Path。同时检查驱动依赖是否还有其他缺包MySQL Connector/J的8.x版本往往只需要这一个jar包但如果项目里同时引用了老版本驱动要全部移除。我校验的方法是打开系统的Maven库或者本地仓库目录确认jar包存在于磁盘上再配置Build Path。5.2 Communications link failure连接被切断还是根本没连上现象程序运行到getConnection()时抛出Communications link failure或者提示Public Key Retrieval is not allowed。原因后者是MySQL 8默认使用caching_sha2_password认证客户端第一次连接时需要服务器返回公钥而JDBC URL没有允许这个行为。前者则是URL里的host或者port写错或者MySQL服务没有启动。解决URL末尾追加allowPublicKeyRetrievaltrue这是最保险的做法。对于链接失败先在本机命令行执行mysql -u root -p确认数据库能连上再用telnet localhost 3306判断端口是否监听。我见过有人因为MySQL服务没启动卡了整整半天这种低级错误最好通过固定流程排查掉而不是反复改代码碰运气。5.3 中文写入MySQL后变成??乱码问题要按三层排查现象界面上显示中文正常但写入MySQL的数据查询出来全是问号或者反过来MySQL客户端中文正常程序读出来却是乱码。原因乱码必须按三层排查——客户端连接层、数据库层、表字段层。连接URL里没写characterEncodingutf8是问号最常见的原因其次是建表时默认字符集是latin1而不是utf8mb4。解决修改URL加上characterEncodingutf8修改建库语句指定DEFAULT CHARACTER SET utf8mb4然后重新建表。这里有个细节很多人忽略如果表已经建了utf8mb4但字段还是latin1需要单独改字段的字符集。我后来学乖了建库建表一上来就指定utf8mb4后面写代码几乎没再碰过乱码。5.4 连续点查询按钮程序越来越慢最后报Too many connections现象程序运行一段时间后点击查询报错getConnection error错误信息里有Too many connections而MySQL服务本身没有挂。原因代码里获取了Connection但没关闭或者只在方法末尾关闭了Connection但SELECT查询里的Statement和ResultSet都被漏掉了。数据库连接数默认上限是151每漏一个连接就少一个名额最终耗尽。解决把所有JDBC操作统一改成try-with-resources写法Connection、PreparedStatement、ResultSet全部自动关闭。如果不想改全量代码可以在DbUtil.close方法里依次关闭ResultSet、Statement、Connection然后严格在DAO的catch块之后调用。这个改动不需要动业务逻辑只是把资源管理的习惯改过来程序稳定性能提升一个量级。5.5 JTable查询后数据不刷新或者越查越长现象点击查询按钮之后表格内容没变化或者第二次查询的结果追加在第一页下面行数越来越多。原因JTable本身的updateUI()不负责重新加载TableModel数据。DefaultTableModel的数据存储是内部维护的Vector数组不调用setRowCount(0)清空addRow就只会往上追加无法识别查询条件变化需要重置列表。解决在每次查询填充前先调用model.setRowCount(0)清空全部行。这个操作会触发TableModel的fireTableDataChanged事件让JTable重新绘制。我推荐的写法是单独封装一个refreshTable()方法内部固定书写清空→查询→循环添加三步任何操作后都调用它。6. 从“能交差”到“敢展示”事务、流式查询与答辩前的验证清单核心功能跑通之后还可以做三件成本低但展示价值高的事事务处理、流式查询、答辩自查清单。这三件事都能在5分钟演示里成为亮点。调薪这个业务是天然的天然事务教学点。一次调薪操作必须写入两条数据更新employee.salary字段、在salary_change表插入一条历史记录。如果只做了第一步而第二步失败员工的工资变了却没有记录留痕反过来则是记了账但工资没变。用事务包住这两步要么全成功要么全失败。代码核心是三行conn.setAutoCommit(false)、conn.commit()、catch里conn.rollback()。注意rollback之前要先判断connection是否为null。批量导入员工数据这个场景可以用JDBC的PreparedStatement批量提交。在URL里加上rewriteBatchedStatementstrue循环里addBatch攒够100条执行一次executeBatch比单条插入快数倍。虽然课程设计的数据量小体会不到性能差异但答辩时能讲清楚这个参数的含义比单纯说我用了JDBC要专业得多。导出员工报表时再提一下流式查询。普通查询会把所有结果一次性载入内存上万条数据时界面可能卡顿。Jdbc里可以设置ps.setFetchSize(Integer.MIN_VALUE)让MySQL边读边取这是jdbc查询流式输出的机制。但这里有一个重要的边界流式查询期间连接不能被关闭结果集未读完时也不能在这个连接上执行其他查询否则会抛出并发异常。理解到这一层答辩时即使数据量只有几百条你也能讲清楚自己的系统设计是考虑了扩展性的。答辩前的自查清单我一般按这个顺序过一遍清空数据库重新执行建表和初始化脚本确认每个功能从空库状态能正常跑通反复开关程序三次确认没有连接泄漏警告把窗口缩到最小再还原确认布局没有组件错位最后在查询框输入一个单引号或者%符号确认程序不会报SQL异常。这几条全过现场演示基本不会翻车。做课程设计这几年下来我的体会是连接生命周期管理和事务一致性是这个项目真正的分水岭。界面美观是加分项不假但如果你能在谈功能的时候随口说出所有操作都在事务里失败会自动回滚老师的关注点就会从界面切到工程素养上。把这些细节做进去这学期的数据库课程设计就不只是交了一份作业而是把Swing、MySQL、JDBC这条技术链路真正握在手里了。希望帮到你。本文还有配套的精品资源点击获取
返回列表