package dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;import model.Stu;
import util.JDBCUtil;public class SelectFenYe {
 public List selectFenYe(){
 Stu stu = new Stu();
 int i=0;
 List list = new ArrayList();
 try{
 JDBCUtil jdbc = new JDBCUtil();
 Connection conn=jdbc.getConnection();
 String sql="select * from fenyeExample";
 PreparedStatement pstm = conn.prepareStatement(sql);
 ResultSet rs =  pstm.executeQuery();
// System.out.print(sql);
 
 while(rs.next()){
 i++;
// int id = rs.getInt(1);
String uid=rs.getString(2);
String name=rs.getString(3);
String password = rs.getString(4);

stu.setUid(uid);
stu.setName(name);
stu.setPassword(password);
list.add(stu);

 }
 }catch(Exception e){
e.printStackTrace(); 
 }

      System.out.println("ssssssssssss"+i);
      return list;
 }
  public static void main(String args[]){
  
  SelectFenYe dao =new SelectFenYe();
   List list =dao.selectFenYe();
   Iterator iter = list.iterator();
   while(iter.hasNext()){
   System.out.println(iter.next());
   }
   
  
  
  }
}我的意思是 把数据从数据库 全取出来,然后全部打印出来我把数据全都放到LIst 里面  返回一List
我在数据库插了26条数据然后我取的时候 怎么只取到了 最后一条数据最后 我又循环的打印  可是循环了26次 都是最后一条数据不知道为什么  怎么才能全部取出来啊  请教了

解决方案 »

  1.   

    1、
    打印sql语句
    然后放到你的那个数据库里看看情况
    2、
    打印list.size()
    3、
    不要用PreparedStatement,可以改为Statement
    4、
    循环输出的语句是否有误
    5、
    list放入iterator是不是会出问题以上自己解决
    祝你成功
      

  2.   

    [Quote=引用 3 楼 xuhesheng 的回复:]
    但是我在SelectFenYe  方法里面循环就可以全部循环出来 但是放在外面就不行了为什么不能用PreparedStatement  我用的没问题啊 
      

  3.   

    Stu stu = new Stu();这个放到re.next里面你打出来的26条数据一定是最后那条吧
      

  4.   

    你放在外面的话
    实例化的只有一个
    其实你每次都是在修改同一个对象
    list真正添加的还是那个你在外面生成的对象
    但是list在添加的时候会检验该对象的hash值
    因为同一个对象
    所以hash相同
    于是就覆盖了这个就是原因放在里面的话没一个循环都new出来一个
    于是hash不同
    所以自然就可以添加进去了我刚才没仔细看你的代码
    ls的解决了你的问题就好了
    注意以后要在内部new出来才行PreparedStatement好像是有什么问题的
    忘记了
    我一直都不用的
    除非要使用参数的情况下
      

  5.   

    因为你放在外面的时候只是有一个Stu实例,那个实例的引用就叫stu,然后rs.next的时候,你确实把26条数据都迭代出来了,不过你都是用stu.setXXX的方式,也就是说,你对Stu同一个实例操作了26次,你每次都是把同一个引用放到集合中去,当然最后你打印的时候,集合中的的所有元素都是指向同一个实例,也就是你看到26行数据都一样的效果不过当你放到re.next下,就是每一次迭代,你都会去new一个Stu实例,再保存,这时那个集合保存的都不是同一个引用了可能上面说的有点含糊,不过LZ,多去看看对象、实例等概念吧
      

  6.   

    因为while循环每次要创建实例一次啊,才能更新数据值
      

  7.   

    你的new写在外面,相对于每次都在对list[0]这个对象的引用进行修改。而不是新加入一条记录。
      

  8.   

    Stu stu = new Stu();
    这个在外面的话 值实例化了一次
    后面的值会覆盖前面的值..
      

  9.   


    这个跟list本身有关比如使用Set的话嘛就可以重复添加了的
      

  10.   

    //whiel些的有问题
    方法一:
    while(){|
    Stu stu = new Stu()

    }
    方法二://用数组做,返回Stu数组
    Stu [] stu = new Stu()
    while(){|
     i++;

    stu[i].setUid(uid);
    stu[i].setName(name);
    stu[i].setPassword(password);

    }//OK
      

  11.   

    对不起,刚才解释错误了
    我给当做另一个去处理的因为实例只有一个
    你在外面new的只有一个u
    那么u就将指向堆中的那唯一的一个
    你循环中的每一次都在修改的这个u其实是同一个因为堆地址还是那唯一的那个
    所以你添加的都是同一个刚才我把它当作Map处理的
    不好意思给你解释错了啊
      

  12.   

    Stu stu=null;
    while(){
    stu = new Stu()

    }
    这样效率高一些,提高性能
      

  13.   

    就是加入 我只取 UID   我怎么取,我那个是一起取的 要是一个呢,还是这么写的话 
      

  14.   

    public static void main(String args[]){SelectFenYe dao =new SelectFenYe();
    List list =dao.selectFenYe();
    Iterator iter = list.iterator();
    while(iter.hasNext()){
    System.out.println(iter.next().getName());              //取name的话
    }
      

  15.   


    iter.next().getName  没有Name 啊  
      

  16.   

    ls的方法需要变成(Stu)(iter.next()).getName()才行
    iter.next()返回的是Object类型
    Object当然没有你那些方法了
    需要转型后才能使用的真是的
    多看看API嘛