java中的ArrayList打印最后插入的值?
Posted
技术标签:
【中文标题】java中的ArrayList打印最后插入的值?【英文标题】:ArrayList in java printing last inserted value? 【发布时间】:2012-12-15 23:39:09 【问题描述】:我有以下 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();
ArrayList<ViewAlbum>allAlbums = new ArrayList<ViewAlbum>();
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;
但是当我试图打印存储在数组列表中的值时。它总是给我最后插入的记录。
<div class="row">
<div class="span10">
<s:iterator value="allAlbums">
<s:property value="albumname"/>
</s:iterator>
</div>
</div>
【问题讨论】:
【参考方案1】:这里,
ViewAlbum album = new ViewAlbum();
// ...
while (resultSet.next())
album.setAlbumid(resultSet.getInt("albumid"));
// ...
allAlbums.add(album);
您正在为所有记录重复使用相同的 album
实例。每次在循环中都会覆盖实例的数据。该列表不包含实例的副本,但它包含对单个实例的 reference 的副本。你知道,Java 是面向对象的。
您应该为每条记录创建一个新的 album
实例。将实例化移动到循环内部。
// ...
while (resultSet.next())
ViewAlbum album = new ViewAlbum();
album.setAlbumid(resultSet.getInt("albumid"));
// ...
allAlbums.add(album);
另见:
How can I pass an Integer class correctly by reference?与具体问题无关,您应该在 finally
块中关闭 JDBC 资源,或者在 try()
try-with-resources 语句中打开它们,否则它们仍然会泄漏在执行查询或处理结果集期间发生异常时离开。您还应该将 JDBC 资源的声明移到方法块内,否则您也会遇到线程安全问题。最后但同样重要的是,您应该使用PreparedStatement
的setter 方法在SQL 字符串中设置用户控制的变量。如果它们是字符串,就会有 SQL 注入攻击漏洞。
另见:
Java Iterator backed by a ResultSet JDBC MySql connection pooling practices to avoid exhausted connection pool【讨论】:
【参考方案2】:您只有一个 ViewAlbum 实例,并且您在整个循环中仅使用该单个实例播放(设置值)。因此,在循环完成后,您只有一个对象插入到 ArrayList 中 N(Size of Resultset) 次数。
【讨论】:
以上是关于java中的ArrayList打印最后插入的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何从java中的抽象类arraylist打印特定的对象类型