【问题标题】:ListArray Saving Same recordsListArray 保存相同的记录
【发布时间】:2014-04-04 01:56:37
【问题描述】:

我正在尝试将我的数据库表保存在 Students 类的 ListArray 中。

public List<Students> getData() {
    //_Students.clear();
    Students tempStudent = new Students();
    List<Students> students = new ArrayList<>();
    dbConnect();
    try {
        stmt = c.createStatement();
        rs = stmt.executeQuery("SELECT * FROM Students;");
        int size = 0;
        while (rs.next()) {
            tempStudent.studentId = rs.getInt("StudentNo");
            tempStudent.studentName = rs.getString("StudentName");
            tempStudent.studentAge = rs.getInt("StudentAge");
            students.add(tempStudent);
            size++;
        }
        rs.close();
        c.commit();
        stmt.close();
        c.close();
    } catch (SQLException e) {
        System.err.println(e.getClass().getName() + ": " + e.getMessage());
        System.exit(0);
    }
    return students;
}

当我尝试将数据打印为时在while循环中

   System.out.println("Student Id: " + tempStudent.studentId);

它打印得非常好。但是当我尝试将其打印为

for (int i = 0; i < size; i++) {
        System.out.println("Student Id: " + student.get(i).studentId);
    }

它打印从数据库中读取的最后一条记录。记录数相同。如果数据库表中保存了 4 行,那么显示的记录也将是 4 次。

我使用 LIST 的方式有问题吗? 谢谢!

【问题讨论】:

  • 创建tempStudent 的一个新实例,开始你的while。您正在覆盖该值。
  • @Muneeb,别说对不起,这个堆栈溢出了。看我的更新。它将清除您的疑问,如下 A.jsp> conntroller.java > dao.java>dbUtil.java

标签: java mysql sql list


【解决方案1】:
Students tempStudent = new Students(); 

改成

Students tempStudent;

你是overriddingproperty of same object,因为你创建了tempStudentoutsidewhile loop。您必须在数据库中添加等于number of recordobjects。所以创建tempStudent object 如下。

使用

while (rs.next()) {
        tempStudent = new Students();
        tempStudent.studentId = rs.getInt("StudentNo");
        tempStudent.studentName = rs.getString("StudentName");
        tempStudent.studentAge = rs.getInt("StudentAge");
        students.add(tempStudent);
        size++;
    }

【讨论】:

    【解决方案2】:

    在每次迭代中创建一个新对象来解决您的问题。

    tempStudent = new Students();
    tempStudent.studentId = rs.getInt("StudentNo");
    tempStudent.studentName = rs.getString("StudentName");
    tempStudent.studentAge = rs.getInt("StudentAge");
    students.add(tempStudent);
    size++;
    

    【讨论】:

    • 因为您正在迭代并将值分配给对象,然后将其添加到列表中。但是您使用相同的对象。所以只有列表包含相同的值。每次都将其创建为新对象。它解决了问题。
    【解决方案3】:

    在while循环中创建Student类的新对象

    while (rs.next()) {
    
                tempStudent = new Students();
                tempStudent.studentId = rs.getInt("StudentNo");
                tempStudent.studentName = rs.getString("StudentName");
                tempStudent.studentAge = rs.getInt("StudentAge");
                students.add(tempStudent);
                size++;
            }
    

    问题是只创建了单个对象,并且在每次迭代中同一对象的属性都会更新并添加到列表中,因此在列表中查看了最后更新的属性,即行的最后一条记录。

    【讨论】:

      【解决方案4】:

      您正在使用同一个 tempStudent 实例。所以 ArrayList 的每个元素都指向同一个 Student 对象。在每次插入列表之前创建。

      【讨论】:

      • 哦,这和链表一模一样,一个指向同一个内存的对象?解释一切!
      【解决方案5】:

      我猜当你作为学生制作一个对象时 它可能如下所示:

        public class Students {
      
          private int StudentId = 0;
          private String StudentName = "defaultName";
          private int StudentAge = 18;
      
          public int getStudentId() {
              return StudentId;
          }
          public void setStudentId(int studentId) {
              StudentId = studentId;
          }
          public String getStudentName() {
              return StudentName;
          }
          public void setStudentName(String studentName) {
              StudentName = studentName;
          }
          public int getStudentAge() {
              return StudentAge;
          }
          public void setStudentAge(int studentAge) {
              StudentAge = studentAge;
          }
      }
      

      也许你会发现你的对象学生有问题!

      【讨论】:

      • 我曾考虑过放置 getter 和 setter。因为这不完全是我要做的。这只是一个学习的例子。我真正想做的是searate,我肯定会把getter/setter放在我的代码中。谢谢!
      【解决方案6】:

      另一个有趣的答案如下:

      public List<User> getAllUsers()
          {
              List<User> users=new ArrayList<User>();
          try
          {
                  Statement stmt=connection.createStatement();
                  ResultSet rs=statement.executeQuery("Select * from Students");
      
                  while(rs.next())
                  {
                      User user=new User();
                      user.setUserid(rs.getInt(("StudentNo");));
                      user.setFirstName(rs.getString("StudentName"));
                      user.setLastName(rs.getString("StudentAge"));
                      users.add(user);
                  }
           }
          catch(SQLException e)
              {
                  e.printStackTrace();
              }
                  return users;
          }
      

      用户将从此格式引用。看看简单的格式如下:

         A.jsp> conntroller.java > dao.java>dbUtil.java 
      

      如何使用该用户如下:

      jsp 是首页**(A.jsp)。如果您想做一些操作,如**删除、更新、添加或其他任何操作,您将在 Java 程序中创建引用操作。 在那个 java 页面中应该在特定的控制器操作中(EX.更新)。我们应该使用用户(来自页面的参考)。

      A.jsp(用户调用)

      First Name: <input type="text" name="firstName" 
                  value="<c:out value="${user.firstName}"/>"/><br/>
      

      Controller.java

      public UserController() 
      {
      dao = new UserDao();
      }
      {
      //controller operation like update;
      }
      

      Dao.java

      public class UserDao 
      {
      private Connection connection;
      public UserDao()
      {
      connection=DbUtil.getConnection();
      }
      public void updateUser(User user)
      {
      //update operation, and here only using the user 
      }
      

      DbUtil.java

      public class DbUtil 
      {
      public static Connection con = null;
      public static Connection getConnection()
      { 
      //db connection 
      }
      }
      

      【讨论】:

      • 什么是用户?它是预定义类还是仅作为对我正在使用的类的引用?是的,这很好。但是我使用的方法增加了代码的外观和感觉。谢谢!
      • @Muneeb,他们的用户是参考列表页面,如 List users=new ArrayList();
      • 我很容易理解你想教我什么。但我要说的是,如果使用 EQUALS 符号 '=' 和其他东西,代码的外观会更好。
      • A.jsp> conntroller.java > dao.java>dbUtil.java ---我不明白这个。对不起!
      • @Muneeb,别说对不起,这个堆栈溢出了。看我的更新。它将清除您的疑问,如下 A.jsp> conntroller.java > dao.java>dbUtil.java
      猜你喜欢
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多