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

如何在SQL中检查重复数据?Java考勤退卡功能如何校验当日同名记录是否存在

Java考勤退卡功能前置校验实现方案

核心实现逻辑

在执行UPDATE更新退卡时间前,先执行SELECT查询判断当日对应用户的考勤记录是否存在,仅当记录存在时才执行退卡操作,同时优化原代码的SQL注入风险。

优化修改后的完整代码

public void AbsenKeluar(){
    loadData();
    String userName = Name.getText().trim();
    if(userName.equals("")){
        JOptionPane.showMessageDialog(null, "Nama tidak boleh kosong");
        return;
    }
    Connection conn = null;
    PreparedStatement checkStmt = null;
    PreparedStatement updateStmt = null;
    ResultSet rs = null;
    try{
        conn = db_koneksi.getConnect();
        // 第一步:查询当日对应用户的考勤记录是否存在,这里用精确匹配,如果需要模糊匹配改成LIKE ?
        String checkSql = "SELECT COUNT(*) FROM data_absensi WHERE nama = ? AND date = CURRENT_DATE";
        checkStmt = conn.prepareStatement(checkSql);
        checkStmt.setString(1, userName);
        rs = checkStmt.executeQuery();
        int count = 0;
        if(rs.next()){
            count = rs.getInt(1);
        }
        if(count == 0){
            JOptionPane.showMessageDialog(null, "今日未查询到您的签到记录,请先签到再退卡");
            return;
        }
        // 第二步:存在记录时执行退卡更新操作,用参数绑定避免SQL注入
        String updateSql = "UPDATE data_absensi SET jadwal_keluar = CURRENT_TIME WHERE nama = ? AND date = CURRENT_DATE";
        updateStmt = conn.prepareStatement(updateSql);
        updateStmt.setString(1, userName);
        updateStmt.executeUpdate();
        getData();
        JOptionPane.showMessageDialog(null, "berhasil absen");
    }catch(SQLException err){
        JOptionPane.showMessageDialog(null, err.getMessage());
    } finally {
        // 资源释放,避免连接泄漏
        try {
            if(rs != null) rs.close();
            if(checkStmt != null) checkStmt.close();
            if(updateStmt != null) updateStmt.close();
            if(conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

关键修改说明

  • 新增了前置查询逻辑:通过COUNT(*)统计当日匹配用户名的记录数,统计结果为0则直接终止后续操作并给出提示
  • 修复了原代码的SQL注入风险:所有参数都通过PreparedStatement的setString方法绑定,不再直接拼接SQL字符串
  • 优化了资源管理:新增finally块统一释放数据库连接、语句对象和结果集,避免资源泄漏
  • 调整了用户名匹配规则:默认使用精确匹配=,如果业务确实需要模糊匹配,可将查询和更新SQL中的=替换为LIKE,绑定参数时传入"%" + userName + "%"即可

内容的提问来源于stack exchange,提问作者Miku21 Margareth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:54:04