我遇到了一个奇怪的问题。我有一个包含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);"
,则正确打印每次运行的正确值。谁能告诉我我的代码有什么问题?
谢谢
答案 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);
}