如何在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
相关产品推荐
相关产品推荐

