Java实现从MySQL多表取数计算加班工资并存储的技术问询
加班工资计算与存储的Java实现方案
看起来你正在搭建HR系统里的加班工资核算模块,我来帮你把这段代码补全,实现从多表取数、计算、展示到存储的完整流程。先理清楚你的核心需求:
- 从
attendance表提取指定员工的加班时长 - 从基本工资表(假设叫
basic_salary)获取该员工的小时基本工资 - 计算加班工资并合并到总工资
- 将结果存入专用表留档,同时在Java界面展示
完整代码实现(含优化建议)
我会基于你给出的代码片段完善,同时加入SQL注入防护、资源自动管理和异常友好提示:
import java.sql.*; import javax.swing.JOptionPane; // 假设这是你的界面类方法 public void calculateOvertimePay() { int Eid; // 先处理员工ID输入的合法性 try { Eid = Integer.parseInt(jTextField2.getText()); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "请输入有效的员工ID数字!"); return; } // 数据库相关参数(建议放到配置文件,这里为了演示写死) String url = "jdbc:mysql://localhost:3306/hr?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "adam"; // 注意:MySQL 8.0+ 要用新的驱动类 String driver = "com.mysql.cj.jdbc.Driver"; // 用try-with-resources自动关闭数据库资源,避免泄漏 try (Connection con = DriverManager.getConnection(url, user, password)) { Class.forName(driver); // 1. 一次性查询加班时长和小时基本工资(用JOIN提高效率) String query = "SELECT a.overtime_hours, b.hourly_rate " + "FROM attendance a " + "JOIN basic_salary b ON a.Eid = b.Eid " + "WHERE a.Eid = ?"; try (PreparedStatement pstmt = con.prepareStatement(query)) { pstmt.setInt(1, Eid); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { double overtimeHours = rs.getDouble("overtime_hours"); double hourlyRate = rs.getDouble("hourly_rate"); // 2. 计算加班工资(可根据业务调整倍数,比如平日1.5倍/周末2倍) double overtimePay = overtimeHours * hourlyRate; // 假设总工资=原月基本工资+加班工资,176为每月标准工作时长(8小时×22工作日) double totalSalary = (hourlyRate * 176) + overtimePay; // 3. 将结果存入总工资表(示例表名:salary_summary) String insertQuery = "INSERT INTO salary_summary (Eid, overtime_pay, total_salary) " + "VALUES (?, ?, ?) " + "ON DUPLICATE KEY UPDATE " + "overtime_pay = ?, total_salary = ?"; try (PreparedStatement insertPstmt = con.prepareStatement(insertQuery)) { insertPstmt.setInt(1, Eid); insertPstmt.setDouble(2, overtimePay); insertPstmt.setDouble(3, totalSalary); insertPstmt.setDouble(4, overtimePay); insertPstmt.setDouble(5, totalSalary); int rowsAffected = insertPstmt.executeUpdate(); if (rowsAffected > 0) { // 4. 在界面展示结果 String resultMsg = String.format( "员工ID: %d\n" + "加班时长: %.2f小时\n" + "小时基本工资: %.2f元\n" + "加班工资: %.2f元\n" + "更新后总工资: %.2f元", Eid, overtimeHours, hourlyRate, overtimePay, totalSalary ); JOptionPane.showMessageDialog(null, resultMsg, "计算完成", JOptionPane.INFORMATION_MESSAGE); } } } else { JOptionPane.showMessageDialog(null, "未找到员工ID为" + Eid + "的考勤或基本工资记录!"); } } } catch (ClassNotFoundException e) { JOptionPane.showMessageDialog(null, "数据库驱动加载失败:" + e.getMessage()); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "数据库操作错误:" + e.getMessage()); } }
关键注意事项
- 表结构适配:请根据你的实际数据库表名、字段名调整代码中的
attendance、basic_salary、salary_summary以及对应的字段(比如overtime_hours、hourly_rate) - 加班规则扩展:如果需要区分不同时段的加班倍数(如法定节假日3倍),可以在
attendance表加overtime_type字段,计算时加入分支判断 - SQL注入防护:全程使用
PreparedStatement而不是字符串拼接,避免安全风险 - 资源管理:用
try-with-resources自动关闭Connection、PreparedStatement、ResultSet,不用手动写close() - 异常友好性:给用户明确的错误提示,而不是直接抛出堆栈信息
内容的提问来源于stack exchange,提问作者Abdallah zoubi
相关产品推荐
相关产品推荐

