You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:50:03