1

如何从数据库中检索特定数据并显示?

    String sql = "Select Product_ID,Order_Quantity,Sub_Total from Order_Menu Where Order_ID='"+order_id_1+"'";
    pst = conn.prepareStatement(sql);
    rs = pst.executeQuery();

    while(rs.next()){

        list.add(rs.getString("Product_ID"));
        list.add(rs.getString("Order_Quantity"));
        list.add(rs.getString("Sub_Total"));

        for(int i = 0;i<list.size();i++){
            String item = list.get(i);
            System.out.println("Item" + i + ":" + item);
        }

我定义了数组

ArrayList <String> list = new ArrayList<String>();

我的输出

Item0:P0001  
Item1:1  
Item2:37.0
Item0:P0001 
Item1:1 
Item2:37.0
Item3:P0002 
Item4:2 
Item5:666.0

我的数据库只包含 2 个项目,即 P0001 和 P0002,为什么结果会再显示 1 个项目对不起,我对数组有点困惑

4

5 回答 5

2

每次从结果集中添加记录时,您都会打印整个列表内容。在第一次迭代中,list.size() == 3,所以它打印:

项目 0:P0001 项目 1:1 项目 2:37.0

在第二次迭代中,list.size() == 6,所以它打印:

项目 0:P0001 项目 1:1 项目 2:37.0 项目 3:P0002 项目 4:2 项目 5:666.0

从而使您的最终输出:

项目 0:P0001 项目 1:1 项目 2:37.0 项目 0:P0001 项目 1:1 项目 2:37.0 项目 3:P0002 项目 4:2 项目 5:666.0

将 for 循环移到 while 语句之外应该可以解决它。

while(rs.next()){
  list.add(rs.getString("Product_ID"));
  list.add(rs.getString("Order_Quantity"));
  list.add(rs.getString("Sub_Total"));
}

for(int i = 0;i<list.size();i++){
  String item = list.get(i);
  System.out.println("Item" + i + ":" + item);
}
于 2013-07-13T07:48:40.137 回答
1

首先这不是正确的使用方式PreparedStatement。您应该按以下方式使用它:

String sql = "Select Product_ID,Order_Quantity,Sub_Total from Order_Menu Where Order_ID=?";
pst = conn.prepareStatement(sql);
pst.setString(order_id_1);
rs = pst.executeQuery();

现在,你输出的原因。

您正在添加记录,list假设在列表的每个索引处只有一个产品放置。但事实并非如此。例如,如果您的程序获取产品,P0001那么您将在索引处添加p001,在索引处添加0Order_Quantity 1,在索引处添加1小计。所以,你得到这样的输出。我建议您创建一个单独的类, 如下所示:372Product

class Product
{
  String product_id;
  String order_quantity;
  String sub_total;
  public Product(String product_id, String order_quantity, String sub_total)
  {
    this.product_id = product_id;
    this.order_quantity = order_quantity;
    this.sub_total = sub_total;
  }
  public void setProduct_id(String product_id)
  {
    this.product_id = product_id;
  }
  public void setOrder_quantity(String order_quantity)
  {
    this.order_quantity = order_quantity;
  }
  public void setSub_total(String sub_total)
  {
    this.sub_total = sub_total;
  }
  public String getProduct_id()
  {
    return product_id;
  }
  public String getOrder_quantiy()
  {
    return order_quantity;
  }
  public String getSub_total() 
  {
    return sub_total;
  }
  @Override
  public boolean equals(Object obj)
  {
    if ( obj instanceof Product)
    {
        temp = (Product)obj;
        if (product_id.equals(temp.product_id))
        {
          return true;
        }
    }
    return false;
  }
  @Override
  public int hashCode()//override it in such a way so that you get different hashCode for each product ID.
  {
    return product_id.hashCode();
  }
  @Override
  public String toString()
  {
    return "product_id:"+product_id+", order_quantity:"+order_quantity+", sub_total:"+sub_total;
  }
}

最后,您可以Product按如下方式使用类的对象:

List<Product> list = new ArrayList<Product>();
while(rs.next()){
 Product product = new Product(rs.getString("Product_ID"),rs.getString("Order_Quantity"),rs.getString("Sub_Total"));
  list.add(product);
 }
 for(int i = 0;i<list.size();i++){
 Product item = list.get(i);
 System.out.println("Item" + i + ":" + item);
}
于 2013-07-13T08:11:45.857 回答
0

假设您的数据库表如下:

Product_ID  Order_Quantity  Sub_Total 
P0001       1               37.0
P0002       2               666.0

您的 while 循环将元素添加到您的列表中:

第一次迭代:

list=["P0001","1","37.0"]

第二次迭代:

list=["P0001","1","37.0","P0002","2","666.0"]

因此,当第一次执行 while 循环时,您将获得以下输出:

Item0:P0001
Item1:1
Item2:37.0

在第二次迭代中,由于列表是 ["P0001","1","37.0","P0002","2","666.0"],因此您可以获得更多输出。

Item0:P0001
Item1:1
Item2:37.0
Item3:P0002
Item4:2
Item5:666.0

结合以上两个输出,您将得到:

Item0:P0001
Item1:1
Item2:37.0
Item0:P0001
Item1:1
Item2:37.0
Item3:P0002
Item4:2
Item5:666.0

所以你需要二维数据结构。我建议将一维字符串数组添加到列表中:

String sql = "Select Product_ID,Order_Quantity,Sub_Total from Order_Menu Where    Order_ID='"+order_id_1+"'";
    pst = conn.prepareStatement(sql);
    rs = pst.executeQuery();
    String[] row=new String[3]
    while(rs.next()){

        row[0]=rs.getString("Product_ID");
        row[1]=rs.getString("Order_Quantity");
        row[2]=rs.getString("Sub_Total");

        list.add(row);
}
于 2013-07-13T08:13:29.420 回答
0

您没有在迭代之间清除您的列表。这意味着当您处理第一行时,您的列表将包含三个项目,当您显示第二行时,您的列表将包含第一行和第二行的项目......

你为什么不忘记清单,只是

for (int i = 0; rs.next(); ++i){

    System.out.println("Item " + i);
    System.out.println("Product ID    : " + rs.getString("Product_ID"));
    System.out.println("Order Quantity: " + rs.getString("Order_Quantity"));
    System.out.println("Sub_Total     : " + rs.getString("Sub_Total"));

}

当然不要忘记把整个东西包起来try finally

rs.close();
pst.close();
于 2013-07-13T07:52:46.060 回答
0

确保您在数组列表之外迭代列表

while(){
    //implementation
   }
   for(){
    //Iterate your list
    }
于 2013-07-13T07:53:04.467 回答