簡體   English   中英

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

[英]ArrayList in java printing last inserted value?

我有以下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塊中關閉JDBC資源,或者在try() try-with-resources語句中打開它們,否則在執行查詢或處理過程中出現異常時它們仍然會泄漏結果集。 您還應該將 JDBC 資源的聲明移動到方法塊內部,否則您也會遇到線程安全問題。 最后但並非最不重要的一點是,您應該使用PreparedStatement的 setter 方法在 SQL 字符串中設置用戶控制的變量。 如果它們是字符串,你就會有一個 SQL 注入攻擊漏洞。

也可以看看:

您只有一個 ViewAlbum 實例,並且您在整個循環中僅使用該單個實例進行播放(設置值)。 因此,在循環完成后,您只有一個對象插入到 ArrayList 中 N(結果集的大小)次數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM