gpt4 book ai didi

java - Java 中的 ArrayList 打印最后插入的值?

转载 作者:行者123 更新时间:2023-11-29 09:38:02 24 4
gpt4 key购买 nike

我有以下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;
}

}

我正在从数据库中检索数据并将其添加到我的数组列表中,就像这样

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>

最佳答案

在这里,

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

另见:


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

另见:

关于java - Java 中的 ArrayList 打印最后插入的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14107910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com