2011-07-28 32 views
2

如何獲得的第一個元素中的ResultSet下面的代碼的第一個元素:如何獲得ResultSet中

public List getUserTest(String username, String password) { 

    List userList = new ArrayList(); 


    Connection connection = null; 
    String rstring = null; 
    Statement stmt = null;///******* 
    ResultSet resultSet = null; 
    try { 

     connection = dataSource.getConnection(); 
     stmt = connection.createStatement();///******* 
     resultSet = stmt.executeQuery("SELECT * FROM users WHERE (username)='" + username + "'" 
       + "AND (password)='" + password + "'");///******* 

     while (resultSet.next()) { 
      UsersTest user = new UsersTest(); 
      user.setId(resultSet.getString("id")); 
      user.setUsername(resultSet.getString("username")); 
      user.setPassword(resultSet.getString("password")); 
      userList.add(user); 
     } 


    } catch (SQLException e) { 
     System.err.println(e); 
    } finally { 
     try { 

      if (resultSet != null) { 
       resultSet.close(); 
      } 

      if (stmt != null) { 
       stmt.close(); 
      } 

      if (connection != null) { 
       connection.close(); 
      } 
     } catch (SQLException e) { 
     } 
    } 
    return userList; 
} 
+0

既然你對你的問題有了很好的答案,你應該努力通過選擇其中一個作爲接受的答案來表達你的欣賞。這是適當的禮儀。 –

回答

4

ResultSet中的第一個元素是,你有第一次工作的一個你執行while (resultSet.next())循環,因此其內容用於構建userList的第一個元素。

+0

但是如果你關注while(resultSet.next()),你會發現我用list來添加所有記錄。那麼,如果我只想獲得第一條記錄,並且不需要在查詢中添加其餘記錄,那怎麼辦?換句話說,我只需要列表中的第一個元素,就像上面的代碼一樣。 – user813056

+0

好吧,如果我只想獲得列表中的第一個元素,但它的內容有更多的記錄。 (只有第一條記錄,並忽略其餘部分) – user813056

+0

如果您只想從RestultSet中獲取第一行,那麼不要使用'while(resultSet.next())',而應該使用'if(resultSet.next())'。 –

0

ResultSet不是Java集合,所以沒有真正的第一個元素。您可以訪問

<!-- language: lang-java --> 
while(resultSet.next()) 
{ 
... 
} 

循環的第一次迭代中第一個返回行的列。

2

務必:

resultSet.first() 

檢查API這裏:

http://download.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSet.html 

PS:

在我看來是更好的替代:

while (resultSet.next()) { 
     UsersTest user = new UsersTest(); 
     user.setId(resultSet.getString("id")); 
     user.setUsername(resultSet.getString("username")); 
     user.setPassword(resultSet.getString("password")); 
     userList.add(user); 
    } 

搭配:(返回對象s)

if (!rs.next()) 
    //No user found. 
else { 
    UsersTest user = new UsersTest(); 
    resultSet.first(); 
    user.setId(resultSet.getString("id")); 
    user.setUsername(resultSet.getString("username")); 
    user.setPassword(resultSet.getString("password")); 
} 

return user; 

返回列表:(返回LIST)

List userList = new ArrayList(); 

if (!rs.next()) 
    //No user found.  
else { 
    UsersTest user = new UsersTest(); 
    resultSet.first(); 
    user.setId(resultSet.getString("id")); 
    user.setUsername(resultSet.getString("username")); 
    user.setPassword(resultSet.getString("password")); 
    userList.add(user) //it will only add one element 
} 

return userList; 

要調用你的方法去做:

UsersTest u = new UserTest(); 
List l = getUserTest(username, password) 

if(l.size > 0) 
    u = l.get(0); 
else 
    System.out.println("Cannot find user"); 

我建議,因爲我不認爲你將有2個結果(列表是不必要的)。你期望有0或1個結果!

+0

你是什麼意思User u = resultSet.first(); (((User)) – user813056

+0

編輯我的代碼! – glarkou

+0

如果我複製你的代碼並將其替換爲我的代碼,它會顯示錯誤(布爾代碼已解除引用) – user813056

0

像這樣:

List users = List getUserTest(username, password); 
User user = ((users.size() > 0 ? users.get(0) : null); 

事實是,你的數據庫應該執行的想法,一個用戶名/密碼組合應該足以確定一個獨特的個體。查詢應該返回一個唯一的個體或者返回null。如果你的數據庫有這個約束,你寫的代碼將會以這種方式表現。

如果沒有,您需要考慮您的模式設計。

+0

@duffmo其實用戶名應該是enuf來唯一標識一個人。密碼不應該存儲在數據庫中。所以有理由懷疑模式設計。 – emory

+0

請根據我的代碼編輯您的代碼,以使其非常清晰。謝謝 – user813056