2014-03-03 39 views
4

我想救我的數據庫表中一類學生ListArrayListArray保存相同的記錄

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的方式嗎? 謝謝!

+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因爲你創造了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++; 
    } 
+0

定義inside 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

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

問題只是單個對象創建的while循環中,並在同一個對象的每一次迭代的屬性創建類學生的新對象被更新,並添加列表中的因最後更新的屬性在列表中查看,即該行的最後一條記錄。

1

您使用tempStudent的同一個實例。所以ArrayList的每個元素都指向同一個Students對象。每次插入列表之前創建。

+1

哦,這就像鏈表一樣,指向相同內存的對象?解釋一切! –

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

我曾考慮過把吸氣劑和吸入劑。因爲這不完全是我會做的。這只是學習的一個例子。我真正想做的事情是海水的事情,我一定會把getter/setter放在我的代碼中。謝謝! –

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 

如何來解決這個用戶如下爲:

的JSP是一個頭版**(A.jsp)。如果你想做一些像**刪除,更新,添加或其他任何操作你將在java程序中創建參考操作。 在那個Java頁面應該在特定的控制器操作(例如更新)。我們應該使用用戶(從頁面引用)。

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,他們用戶是參考列表頁面,列表 users = new ArrayList (); – jmail

+0

@Muneeb,看看我的更新....它將清除你的疑問。 – jmail