2014-03-03 4 views
4

Я пытаюсь сохранить таблицу базы данных в ListArray класса Студенты.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; 
} 

В то время как цикл, когда я пытаюсь напечатать данные в виде

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 раза.

Есть ли что-то не так с тем, как я использую СПИСОК? Спасибо!

+1

Создать новый экземпляр 'tempStudent' в начало вашего времени. Вы переписываете значение. – hofmeister

+0

@Muneeb, не извините, этот стек над потоком. Посмотрите мое обновление. он очистит ваше сомнение, следуя A.jsp> conntroller.java> dao.java> dbUtil.java – jmail

ответ

4
Students tempStudent = new Students(); 

изменить его

Students tempStudent; 

Вы overriddingproperty of same object с момента создания tempStudentoutside на while loop. Вы должны добавить objects, равный number of record в базе данных. Поэтому создайте 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++; 
    } 
+0

Определение внутри цикла while отлично работает. Благодаря! –

+0

@MuneebMirza, Да, это сработает. – Rahul

4

Создать новый объект в каждой итерации, что будет решить вашу проблему.

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

Поскольку вы выполняете итерирование и присваиваете значения объекту, добавьте его в список. Но вы используете один и тот же объект. Таким образом, только список содержит одно и то же значение. Создавайте его как новый объект каждый раз. Это решает проблему. – newuser

2

Создать новый объект класса 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++; 
     } 

Вопрос был только один объект был создан и в каждой итерации атрибутов того же объекта обновляется и добавить в список из-за последние обновленные атрибуты просматриваются в списке, т.е. последней записи строки.

1

Вы используете тот же экземпляр tempStudent. Таким образом, каждый элемент ArrayList указывает на тот же объект-ученик. Создавайте каждый раз, когда вы вставляете в список.

+1

oh, так это похоже на связанные списки, объект, указывающий на ту же память? Объясняет все! –

1

я думаю, когда вы делаете объект как студенты это может понравиться наблюдение:

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; 
    } 
} 

может быть, вы найдете что-то неправильно на вашем студента объекта!

+0

Я думал о том, чтобы поместить геттеры и сеттеры. Поскольку это не совсем то, что я буду делать. Это просто пример обучения. То, что именно я хочу сделать, - это обмануть вещь, и я уверен, что в моем коде будут использовать getters/setters. Благодаря! –

1

Еще один интересный ответ следующий как:

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 

, как работать с этим пользователем следующим образом:

СПЯ является первой страницей ** (A.jsp) , Если вы хотите выполнить некоторую операцию, например: ** удалить, обновить, добавить или что-нибудь еще, вы собираетесь создать эталонную операцию в java-программе. В этой странице java должна находиться конкретная операция контроллера (EX. Update). мы должны использовать пользователя (ссылка со страницы).

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 
} 
} 
+0

Что такое пользователь? это предопределенный класс или просто как ссылка на класс, который я использую? и да, это хорошо. но метод, который я использовал, увеличивает внешний вид и ощущения КОДА. Благодаря! –

+0

@Muneeb, они Пользователь является страницей списка ссылок, например, List users = new ArrayList (); – jmail

+0

@Muneeb, просто посмотрите на мои обновления ... он будет очищать ваши сомнения. – jmail

Смежные вопросы