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

时间:2013-07-13 07:42:26

标签: java sql database prepared-statement

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

    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个项目 对不起,我对阵列有点混淆

5 个答案:

答案 0 :(得分:2)

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

Item0:P0001 Item1:1 Item2:37.0

在第二次迭代中,list.size() == 6,打印出来:

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

在while语句之外移动for循环应修复它。

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

答案 1 :(得分: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添加0,在索引1添加Order_Quantity 1并在小计37添加在索引2。所以,你得到这样的输出。我建议你为Product创建一个单独的类,如下所示:

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

答案 2 :(得分: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();

答案 3 :(得分:0)

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

while(){
    //implementation
   }
   for(){
    //Iterate your list
    }

答案 4 :(得分: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

在第二次迭代中,因为list是[“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);
}