2014-10-30 79 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())')将数据库中的数据检索到对象中。 – 2014-10-30 07:56:49

回答

2

如果您的查询获取多个行,您应该有一个循环并创建多个Product实例。您当前的代码只会读取第一行并创建单个产品实例。

这里有一个更好的实现,将加载查询返回的所有数据:您需要创建的`object` Product`类的`阵列

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,我也以同样的方式感受到了,但为什么你会从第一行开始说一个产品实例呢?它不应该是最后一排吗?因为我认为'next'方法会遍历,直到最后一行返回,并且基于最后一行创建Product实例。我不知道我是否正确,我的意思是为每行创建一个Product的Product实例,只有在循环的下一次迭代时才会'over',直到达到最后一行。 – Sor 2014-10-30 07:58:37

+0

@Sor既然你只调用一次next()方法,它会使ResultSet指向第一个返回的行。每次调用next()都会将ResultSet移动到下一行。你的代码中没有循环。你有一个if语句。我建议的代码有一个循环。如果你有一个循环,产品参考将在每次迭代中被覆盖。 – Eran 2014-10-30 08:04:51