public ArrayList<Suser> findAll(String keyword) throws Exception {
al=new ArrayList<Suser>();
ps=conn.prepareStatement("select userid,name,password from suser where userid LIKE ? OR name LIKE ?");
ps.setString(1,"%"+keyword+"%");
ps.setString(2,"%"+keyword+"%");
rs=ps.executeQuery();
while(rs.next()) {
al.add(new Suser(rs.getString("userid"),rs.getString("name"),rs.getString("password")));
/* Suser su=new Suser();
su.setUserid(rs.getString("userid"));
su.setName(rs.getString("name"));
su.setPassword(rs.getString("password"));
System.out.println(su.toString());
al.add(su); */
}
rs.close();
ps.close();
conn.close();
return al;
}以上是我一个方法的代码,功能是查询数据库,返回Suser的元素集合.
奇怪的,每次返回的ArrayList al, 当我遍历al取出元素的时候,所有的元素都是一样的,值都跟最后取得的那个元素相同.
我注释掉的那一段代码也产生了相同的结果,不知道为什么?

解决方案 »

  1.   

    我是问你这个select userid,name,password from suser where userid LIKE ? OR name LIKE 查询出来的数据是不是一样的,如果是一样的那说明你的数据有问题;如果不一样就不太明白了。
      

  2.   

    不是数据库的问题...我查询出的结果打印出来观察过...只是放到容器ArrayList中的时候值会最终变成一样...跟最后一个查询结果一样.
      

  3.   

    /* Suser su=new Suser();
    su.setUserid(rs.getString("userid"));
    su.setName(rs.getString("name"));
    su.setPassword(rs.getString("password"));
    System.out.println(su.toString());
    al.add(su); */
    正如我注释掉的代码...我先将su对象打印出来观察.然后最后将al打印出来...结果是这样的
    open--your--mouth
    admin--administrator--admin
    Jack--hujie--king
    guest--guest--guset                //以上为su打印出来的[guest--guest--guest,guest--guest--guest, guest--guest--guest,guest--guest--guest]
    //这是al打印出来的结果...也就是说将su add到al中后值不知道为什么全变成这样了...
      

  4.   

    研究发现...ArrayList是添加的对象的引用,那么这样是说我添加进去对象su后,后面的操作又改变了su的值...所以都变成一样的了...但是我每次都是新new出来的一个对象啊....为什么会指向同一个对象呢???奇怪!!!
      

  5.   

    我也觉得不可能,光看这片代码不可能。要不你先把new ArrayList<Suser>改成new ArrayList<String>试试。al.add(rs.getString("userid") + "|" + rs.getString("name") + "|" + rs.getString("password"));然后再看看打印出来的是否总是为最后一行
      

  6.   

    代码没有问题的样子。 
    最有可能的是,搜出来的结果就是多条一样的数据。 
    强烈建议lz试试楼上的方法。 
    同时最好要不你先把new ArrayList<Suser>改成new ArrayList<String>试试。
    String temp = rs.getString("userid") + "|" + rs.getString("name") + "|" + rs.getString("password");
    System.out.println(temp);
    al.add(temp);
      

  7.   

    你是不是在Suser类里重写了它的相等方法?
      

  8.   

    你是如何打印出al里的
    [guest--guest--guest,guest--guest--guest, guest--guest--guest,guest--guest--guest]
    在al填充完成后,你对他有没有进行过其它的操作。
    不应该出现你说的情形,你可以直接用debug模式调试一下,一切不就清楚了吗?
      

  9.   

    ArrayList可以装相同的对象好不!就是你有一千个相同对象 也不可能变为一个 这是肯定的
      

  10.   

    我觉得楼主代码有问题,既然是选择所有的就不应该有where之后的条件,直接select userid,name,password from suser遍历所有的信息,然后把他们添加到集合中去public ArrayList<Suser> findAll(String keyword) throws Exception {
    al=new ArrayList<Suser>();
    ps=conn.prepareStatement("select userid,name,password from suser");
    ps.setString(1,"+keyword+");
    rs=ps.executeQuery();
    while(rs.next()) {
    al.add(new Suser(rs.getString("userid"),rs.getString("name"),rs.getString("password")));
    }
    rs.close();
    ps.close();
    conn.close();
    return al;
    }同时附加上以前的代码供楼主参考希望能帮助楼主解决问题
    public Collection findAll() {
    Collection<Person> list = new ArrayList<Person>();
    Connection conn = null;
    PreparedStatement pst = null;
    ResultSet rs = null;
    try {
    conn = JdbcTools.getConnection();
    conn.setAutoCommit(false);
    String sql = "select id,name,passwd,birthday from person";
    pst = conn.prepareStatement(sql);
    rs = pst.executeQuery();
    while (rs.next()) {
    list.add(new Person(rs.getInt("id"), rs.getString("name"), rs
    .getString("passwd"), rs.getDate("birthday")));
    }
    conn.commit();
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    JdbcTools.free(rs, pst, conn);
    }
    return list;
    }
      

  11.   

    看了楼主的代码,你试试把 Suser su=new Suser();放到while前面。看行不
      

  12.   

    看那个ArryList遍历的有没有问题。这个应该是对的
      

  13.   

    al=new ArrayList<Suser>();
    定义成局部试试
    ArrayList<Suser> al=new ArrayList<Suser>();
      

  14.   

    把这一句Suser su=new Suser();
    放在while循环外面。可以试下,如果成功,自己想想为什么放在里面会错?如果想出来可以分享下理由,看看彼此理解是否一样
      

  15.   

    看你这段代码是没有问题的,建议楼主做一下两件事情排查
    1、直接在数据库中执行select userid,name,password from suser where userid LIKE ? OR name LIKE ?这个sql看它是不是一样的
    2、在上一层调用方法中debug调试al里面的内容,如果1排查的没问题的话,我很怀疑楼主是在读取al时犯了错误。
      

  16.   

    public ArrayList<Userinfo> findAll(String keyword) throws Exception {
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList<Userinfo> list=new ArrayList<Userinfo>();
    con = new MyDBManager1().getConDB();//连接到数据库的方法 ps = con.prepareStatement("select uid,uname,upwd from userinfo where uid LIKE ? OR upwd LIKE ?");
    ps.setString(1,"%"+keyword+"%");
    ps.setString(2,"%"+keyword+"%");
    rs=ps.executeQuery();

    while(rs.next()) {
    //al.add(new Suser(rs.getString("userid"),rs.getString("name"),rs.getString("password")));
    Userinfo su=new Userinfo();
    su.setUid(rs.getString("uid"));
    su.setUname(rs.getString("uname"));
    su.setUpwd(rs.getString("upwd"));
    System.out.println(su.toString());
    list.add(su); 
    }
    rs.close();
    ps.close();
    con.close();
    return list;
    }

    public static void main(String args[]){
    try {
    ArrayList<Userinfo> al = new TestCon().findAll("0");
    for(Userinfo u:al){
    System.out.println(u.getUid()+"\t"+u.getUname()+"\t"+u.getUpwd());
    }
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }照着你的代码做,你的代码没有错:输出结果为:
    0001 along 123456
    0002 admin 123456
    0003 feixue 023456
    0004 wuhua 124006跟数据库一样。应该是你调试有问题