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取出元素的时候,所有的元素都是一样的,值都跟最后取得的那个元素相同.
我注释掉的那一段代码也产生了相同的结果,不知道为什么?
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取出元素的时候,所有的元素都是一样的,值都跟最后取得的那个元素相同.
我注释掉的那一段代码也产生了相同的结果,不知道为什么?
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中后值不知道为什么全变成这样了...
最有可能的是,搜出来的结果就是多条一样的数据。
强烈建议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);
[guest--guest--guest,guest--guest--guest, guest--guest--guest,guest--guest--guest]
在al填充完成后,你对他有没有进行过其它的操作。
不应该出现你说的情形,你可以直接用debug模式调试一下,一切不就清楚了吗?
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;
}
定义成局部试试
ArrayList<Suser> al=new ArrayList<Suser>();
放在while循环外面。可以试下,如果成功,自己想想为什么放在里面会错?如果想出来可以分享下理由,看看彼此理解是否一样
1、直接在数据库中执行select userid,name,password from suser where userid LIKE ? OR name LIKE ?这个sql看它是不是一样的
2、在上一层调用方法中debug调试al里面的内容,如果1排查的没问题的话,我很怀疑楼主是在读取al时犯了错误。
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跟数据库一样。应该是你调试有问题