Java Swing登录表单未显式比较字符串,rs.next()如何实现验证?
关于Java Swing登录表单中ResultSet.next()验证匹配的疑问
我跟着YouTube教程做了连接MySQL的Java Swing登录表单,当输入的用户名、密码和数据库数据匹配时,会跳转到新的JForm。但我有个疑惑:代码里没写显式的字符串比较,ResultSet的rs.next()是怎么检测输入和数据库数据是否匹配的?
相关代码如下:
private void loginbuttonActionPerformed(java.awt.event.ActionEvent evt) { try { Class.forName("com.mysql.cj.jdbc.Driver"); String dataBase = "jdbc:mysql://localhost/laundry_akun"; String dbUsername = "root"; String dbPassword = ""; Connection con = DriverManager.getConnection(dataBase,dbUsername,dbPassword); String username = username_textfield.getText(); String password = password_textfield.getText(); Statement st = con.createStatement(); String sql = "SELECT * FROM akun WHERE username='" + username + "' and password='" + password + "'"; ResultSet rs = st.executeQuery(sql); if(rs.next()){ dispose(); testpage tes = new testpage(); tes.show(); }else{ JOptionPane.showMessageDialog(this, "Username or Password Wrong"); username_textfield.setText(""); password_textfield.setText(""); } con.close(); } catch (Exception e) { System.out.println(e.getMessage()); } }
原理说明
字符串比较的逻辑不是在Java代码里执行的,而是交给MySQL数据库处理的,核心就在这条SQL查询语句:
SELECT * FROM akun WHERE username='" + username + "' and password='" + password + "'";
当你执行这条SQL时,数据库会自动遍历akun表的所有记录,把每条记录的username和password字段,分别和你输入的用户名、密码做字符串匹配:
- 如果找到完全匹配的记录,SQL会返回包含这条记录的结果集
- 如果没有任何匹配的记录,结果集就是空的
而rs.next()的作用只是检查结果集里是否存在可读取的记录:
- 当结果集非空(存在匹配的用户),
rs.next()返回true,触发跳转新页面的逻辑 - 当结果集为空(无匹配用户),
rs.next()返回false,弹出登录失败的提示
额外提醒
当前代码用字符串拼接生成SQL的写法存在SQL注入风险,比如用户输入特殊字符可能篡改SQL逻辑。建议改用PreparedStatement做参数化查询,示例代码如下:
String sql = "SELECT * FROM akun WHERE username=? and password=?"; PreparedStatement pst = con.prepareStatement(sql); pst.setString(1, username); pst.setString(2, password); ResultSet rs = pst.executeQuery();
这种写法既安全,还能避免字符串拼接导致的SQL语法错误。
内容的提问来源于stack exchange,提问作者user16787623
相关产品推荐
相关产品推荐

