2011-07-28 3 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

질문에 대한 답변이 좋기 때문에 그 중 하나를 대답으로 선택하여 감사를 표시해야합니다. 그것은 적절한 SO 에티켓입니다. –

답변

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의 OBJECT)

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 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; 

이 메소드를 호출 (RETURNS의 LIST)를 수행

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(); ((사용자)) – user813056

+0

내 코드를 수정했습니다! – glarkou

+0

코드를 복사하여 코드로 바꾼다면 오류가 발생합니다 (불리언 값은 역 참조) – user813056

0

:

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

진실은 데이터베이스가 사용자 이름/암호 조합이 고유 한 개인을 식별하기에 충분되어야한다는 생각을 시행 마땅 것입니다. 쿼리는 고유 한 개인 또는 null을 반환해야합니다. 데이터베이스에이 제약 조건이있는 경우 작성된 ​​코드가 이러한 방식으로 작동합니다.

그렇지 않으면 스키마 디자인에 대해 생각해 봐야합니다.

+0

@duffmo 실제로 개인을 식별 할 수 있도록 사용자 이름 만 입력해야합니다. 암호는 절대로 데이터베이스에 저장되어서는 안됩니다. 따라서 이미 스키마 디자인을 의심 할만한 이유가 있습니다. – emory

+0

코드에 따라 코드를 편집하여 매우 명확하게 만들 수 있습니까? 감사 – user813056

관련 문제