【问题标题】:ArrayList in java printing last inserted value?java中的ArrayList打印最后插入的值?
【发布时间】: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>

【问题讨论】:

    标签: java jsp arraylist


    【解决方案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);
    }
    

    另见:


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

    另见:

    【讨论】:

      【解决方案2】:

      您只有一个 ViewAlbum 实例,并且您在整个循环中仅使用该单个实例播放(设置值)。因此,在循环完成后,您只有一个对象插入到 ArrayList 中 N(Size of Resultset) 次数。

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多