javaList中的ArrayList最后插入的值?

我有以下java类

package com.picvik.model; import java.util.Date; public class ViewAlbum { private Integer albumid; private String albumname; private String description; private String location; private Date date; private Integer uid; public Integer getAlbumid() { return albumid; } public void setAlbumid(Integer albumid) { this.albumid = albumid; } public String getAlbumname() { return albumname; } public void setAlbumname(String albumname) { this.albumname = albumname; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } } 

我正在从db中检索数据并将其添加到我的数组列表中

 public ArrayList getAllAlbums(Integer uid) { ViewAlbum album = new ViewAlbum(); ArrayListallAlbums = new ArrayList(); try { String qstring = "SELECT albumid, albumname, description, location," + " date, uid FROM picvik_picture_album WHERE " + "uid = '" + uid + "';"; System.out.println(qstring); connection = com.picvik.util.MySqlConnection.getInstance().getConnection(); ptmt = connection.prepareStatement(qstring); resultSet = ptmt.executeQuery(); while(resultSet.next()) { //System.out.println(resultSet.getString("albumname")); album.setAlbumid(resultSet.getInt("albumid")); album.setAlbumname(resultSet.getString("albumname")); album.setDescription(resultSet.getString("description")); album.setLocation(resultSet.getString("location")); album.setDate(resultSet.getDate("date")); album.setUid(resultSet.getInt("uid")); allAlbums.add(album); } resultSet.close(); ptmt.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } return allAlbums; } 

但是当我试图打印存储在数组列表中的值时。 它总是给我最后插入的记录。

 

这里,

 ViewAlbum album = new ViewAlbum(); // ... while (resultSet.next()) { album.setAlbumid(resultSet.getInt("albumid")); // ... allAlbums.add(album); } 

您正在为所有记录重复使用相同的album实例。 每次在循环中都会覆盖实例的数据。 该列表不包含实例的副本,但它包含对单个实例的引用的副本。 你知道,Java是面向对象的。

您应该为每个记录创建一个新的album实例。 将实例化移动到循环内部。

 // ... while (resultSet.next()) { ViewAlbum album = new ViewAlbum(); album.setAlbumid(resultSet.getInt("albumid")); // ... allAlbums.add(album); } 

也可以看看:

  • 如何通过引用正确传递Integer类?

具体问题无关 ,您应该关闭finally块中的JDBC资源,或者在try() try-with-resources语句中打开它们,否则在执行查询或处理期间出现exception时它们仍会泄漏结果集。 您还应该将JDBC资源的声明移到方法块内部,否则您也会遇到线程安全问题。 最后但并非最不重要的一点是,您应该使用PreparedStatement的setter方法在SQL字符串中设置用户控制的变量。 如果它们是字符串,你就会有一个SQL注入攻击漏洞。

也可以看看:

  • 由ResultSet支持的Java Iterator
  • JDBC MySql连接池实践,以避免耗尽连接池

您只有一个ViewAlbum实例,并且您在整个循环中仅使用该单个实例播放(设置值)。 因此,在循环完成之后,您只有一个对象插入到ArrayList中N(Resultset的大小)没有时间。