ListArray保存相同的记录

时间:2014-03-03 05:56:55

标签: java mysql sql list

我正在尝试将数据库表保存在类学生 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的方式有问题吗? 谢谢!

6 个答案:

答案 0 :(得分:4)

Students tempStudent = new Students(); 

将其更改为

Students tempStudent;

overridding property of same object tempStudent创建outside后,您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++; } ,如下所示。

使用

{{1}}

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

您正在使用相同的tempStudent实例。因此ArrayList的每个元素都指向相同的Students对象。每次插入列表时都要创建。

答案 4 :(得分: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;
    }
}

也许你会发现你的对象学生出了什么问题!

答案 5 :(得分: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页面应该在特定的控制器操作(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 
}
}