2014-10-30 2 views
0

ResultSet을 기반으로 만들어진 개체에 관한 질문이 있습니다.결과 집합을 기반으로 개체 만들기

의 나는 제품 DAO 클래스가 있다고 가정 해 봅시다 :

public class ProductDAO 
{  
    ... 
    ResultSet products = statement.executeQuery("SELECT * FROM PRODUCT "); 

    if (products .next()) { 
     int prodId = products .getInt("id");   
     String prodName = products .getString("name");  
     Product product = new Product(prodId, prodName);  
    }   
    ... 
} 

이의이 SQL 쿼리는 5 개 행을 반환한다고 가정 해 봅시다. 결과적으로 제품 오브젝트에는 최종적으로 어떤 내용이 포함됩니까? 마지막으로 반환 된 행 (이 경우에는 5 번째 행)의 값만 포함합니까?

+0

다음 while' 루프 ('동안 ('사용

다음은 쿼리에 의해 반환 된 모든 데이터를로드 할 더 나은 구현입니다 products.next())')를 사용하여 데이터베이스에서 객체로 데이터를 검색합니다. –

답변

2

쿼리에서 둘 이상의 행을 가져 오는 경우 루프가 있어야하며 여러 Product 인스턴스를 만들어야합니다. 현재 코드는 첫 번째 행을 읽고 단일 Product 인스턴스 만 작성합니다. 당신은 Product` 클래스`의 object``의 배열을 만들 필요가

List<Product> productList = new ArrayList<Product>(); 
while (products.next()) { 
    int prodId = products .getInt("id");   
    String prodName = products .getString("name");  

    Product product = new Product(prodId, prodName);  
    productList.add(product); 
} 
+0

감사합니다. Eran, 저도 같은 생각을했습니다.하지만 첫 번째 행에서 단일 Product 인스턴스를 말하는 이유는 무엇입니까? 마지막 행이되어서는 안됩니까? 왜냐하면 마지막 행이 반환되고 Product 인스턴스가이 마지막 행을 기반으로 만들어 질 때까지 '다음'메서드가 통과 할 것이라고 생각했기 때문입니다. 이 권리를 얻는 지 확실하지 않습니다. 제품의 '제품'인스턴스가 각 행에 대해 생성되고, 마지막 행에 도달 할 때까지 루프의 다음 반복에 의해 '초과 사용'됩니다. – Sor

+0

@Sor 한 번만'next()'메소드를 호출하기 때문에 ResultSet이 첫 번째로 반환 된 행을 가리 킵니다. 'next() '를 호출 할 때마다 ResultSet이 다음 행으로 이동합니다. 코드에 루프가 없습니다. if 문이 있습니다. 제안 된 코드에 루프가 있습니다. 루프가있는 경우 각 반복에서 제품 참조를 덮어 씁니다. – Eran

관련 문제