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