while(rs.next()) 不是 returns 所有记录,而是最后一条

while(rs.next()) does not returns all records but just the last one

在我的例子中,我使用 PreparedStatement 到 select 来自我的数据库的记录: selected 的行数是正确的,但只显示最后一行。

我的代码:

while (rs.next()) {
    DetailCaisse detailCaisse = new DetailCaisse();
    devise.setLibSiglDev(rs.getString("LIB_DEV_DEV"));
    devise.setLibSiglDev(rs.getString("LIB_SIGL_DEV"));
    devise.setCodDevDev(rs.getInt("cod_Dev_dev"));
    detailCaisse.setDevise(devise);
    deviseDispo.add(detailCaisse);
}

我应该使用什么来代替 while(rs.next()) 来更正问题?

您对 while(rs.next()) 的使用没有任何问题。问题是您不断用新值覆盖相同的 devise 实例,从而丢失旧值。相反,您应该在每次迭代时创建一个新实例:

while (rs.next()) {
    DetailCaisse detailCaisse = new DetailCaisse();

    Devise devise = new Devise(); // Here!
    devise.setLibSiglDev(rs.getString("LIB_DEV_DEV"));
    devise.setLibSiglDev(rs.getString("LIB_SIGL_DEV"));
    devise.setCodDevDev(rs.getInt("cod_Dev_dev"));

    detailCaisse.setDevise(devise);

    deviseDispo.add(detailCaisse);
}

the number of rows selected is correct but just the last one is displayed.

你不能两全其美。您要么正确计算了所有行,要么没有正确计算。你做到了,除非 while (rs.next()) 有效,否则你不可能得到正确的计数,ergo while (rs.next()) 是正确的代码。

很明显哪里有问题else.

为了 100% 地告诉您问题出在哪里,您的代码的某些部分丢失了,但您似乎在 while 循环之前声明了 devise 并且您覆盖了它的值在每次迭代中。 这就是为什么你有 3 个结果,但它们都是一样的。

此外,请注意,您在循环内用 2 个不同的值覆盖了 setLibSiglDev,它只会使用 LIB_SIGL_DEV

detailCaisse.setDevise(devise); 每次迭代都采用相同的引用但每次迭代引用值都会更改的问题,因此显示迭代值你应该在每次迭代中创建新的 new Devise();