2016-04-27 205 views
2

我想用數據庫信息驗證用戶輸入。因此,如果用戶輸入用戶名,它將檢查是否與數據庫匹配。使用數據庫進行Java用戶名和密碼驗證

public void login() throws SQLException { 
     boolean loginUsername = false; 
     boolean loginPassword = false; 
     String input = null; 

     while(input == null) { 
      System.out.println(message.loginUsername()); 
      input = in.nextLine(); 

      try { 
       preparedStatement = connect.prepareStatement("SELECT username FROM doom.accounts;"); 
       rs = preparedStatement.executeQuery(); 

       while(rs.next()) { 
        String username = rs.getString("username"); 

        if(!input.equals(username)) { 
         System.out.println(message.invalidUsername()); 
         input = null; 
        } else { 
         loginUsername = true; 
        } 
       } 
      } catch(SQLException e) { 

      } finally { 
       if(statement != null) { 
        statement.close(); 
       } 
      } 
     } 
} 

我只發佈了方法的用戶名部分。我已經調試過,並且可以確認我的用戶輸入確實等於數據庫中的有效用戶名,但是當它不應該時,我仍然收到無效的用戶名消息。

+6

由於您使用的是數據庫,爲什麼不讓數據庫在您的SQL語句中使用'where'子句在正確的用戶名中查找表中的行?它效率更高。 – hexafraction

+0

heed @ hexafraction的建議。非常沒有效率的方式。 – JJF

+0

數據庫中的列名可能會返回爲'USERNAME'而不是'username',因此請嘗試使用rs.getString(「USERNAME」)或rs.getString(1)'。並使用像@hexafraction這樣的where子句說。 – GriffeyDog

回答

2

通過編寫SQL查詢以及在字符串中執行equals檢查時確定它們是否在字符串中相同。如果案件不重要,您可以使用equalsIgnoreCase()

更好的方法將是您的查詢改成這樣:

select username from doom.accounts where username like ? 

記住要離開了「;」

看看PreparedStatement和在?

設置的用戶名,您可以看看here