Java ArrayList起作用

时间:2015-03-21 06:41:08

标签: java database arraylist

我遇到了一个奇怪的问题。我有一个包含6个不同“出价”的数据库。我试图使用以下代码提取出价:

public ArrayList<ProjectBid> getProjectBids(String projectID)
    {
        ArrayList<ProjectBid> result = new ArrayList<ProjectBid>();

        ProjectBid bid = new ProjectBid();

        try{

        st = con.createStatement();
        String query = "SELECT * FROM bids WHERE projectID=\""+projectID+"\"";
        System.out.println(query);
        ResultSet rs = st.executeQuery(query);


        while (rs.next())
          {
            bid.setProjectID(projectID);
            bid.setBidID(rs.getString("bidID"));
            bid.setBidderEmail(rs.getString("bidder_email"));
            bid.setBidAmount(rs.getInt("bid_amount"));
            bid.setBidMessage(rs.getString("bid_message"));
            bid.setTimestamp(rs.getString("timestamp"));

            result.add(bid);
          }
          st.close();

        }
        catch(Exception ex){
            System.out.println("Exception: "+ex);
        }

        return result;          
    }

出于某种原因,我的ArrayList结果给了我6个相同的“出价”对象,而不是单独添加我的数据库中的每个“出价”。代码按预期运行ResultSet,如果我在while循环中添加"System.out.println(bid.getBidID);",则正确打印每次运行的正确值。谁能告诉我我的代码有什么问题?

谢谢

3 个答案:

答案 0 :(得分:3)

添加

ProjectBid bid = new ProjectBid();
while循环中

。截至目前,您只是覆盖了相同的ProjectBid对象。因此,ArrayList中的每个引用都指向您在循环中不断更改的相同对象值。因此,最后,您将使ArrayList中的所有元素的数据与从数据库中检索的最后一行相同。

    while (rs.next())
      {
        ProjectBid bid = new ProjectBid();
        bid.setProjectID(projectID);
        bid.setBidID(rs.getString("bidID"));
        bid.setBidderEmail(rs.getString("bidder_email"));
        bid.setBidAmount(rs.getInt("bid_amount"));
        bid.setBidMessage(rs.getString("bid_message"));
        bid.setTimestamp(rs.getString("timestamp"));

        result.add(bid);
      }

答案 1 :(得分:3)

您应该在while循环中移动ProjectBid bid = new ProjectBid();。使用当前代码,您将更新在bid循环之外定义的相同while变量,因此它在循环完成后获取最后一条记录的值。

答案 2 :(得分:1)

由于对出价的引用始终相同,因此它会使用当前值覆盖出价,而当前值会更改结果列表中的所有出价,从而为您添加最后一次出价。

在循环中实例化出价对象,这应该可以正常工作。

while (rs.next())
  {
    ProjectBid bid = new ProjectBid();
    ...
    ...
    ...
    result.add(bid);
  }