Сохранить запись базы данных в список
Как я могу поместить запись базы данных в ArrayList? Я хочу просмотреть его в jsp файлах. Но значение всего объекта в ArrayList совпадает с последней записью в базе данных, которую я выбрал.
У меня есть этот код в моем проекте:
IPBean.java
public class IPBean {
private String ip;
private String userName;
private String password;
private int maxRetry;
public String getIp() {
return ip;
}
protected void setIp(String ip) {
this.ip = ip;
}
public String getUserName() {
return userName;
}
protected void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
protected void setPassword(String password) {
this.password = password;
}
public int getMaxRetry() {
return maxRetry;
}
protected void setMaxRetry(int maxRetry) {
this.maxRetry = maxRetry;
}
}
IPBeanMapper.java
import java.sql.*;
import java.util.ArrayList;
public class IPBeanMapper {
public ArrayList<IPBean> getIPList() throws SQLException, ClassNotFoundException {
ArrayList<IPBean> ipList = new ArrayList<IPBean>();
Connection conn = null;
conn = ConnectionTools.getConnection();
String SQL = "SELECT * FROM LIST_IPM";
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery(SQL);
IPBean ipBean = new IPBean();
while (rs.next()){
ipBean.setIp(rs.getString("IP"));
ipBean.setMaxRetry(rs.getInt("NUM_OF_RETRY"));
ipBean.setPassword(rs.getString("PASSWORD"));
ipBean.setUserName(rs.getString("USERNAME"));
ipList.add(ipBean);
}
ConnectionTools.attemptClose(rs);
ConnectionTools.attemptClose(statement);
ConnectionTools.attemptClose(conn);
System.out.print(ipList.size());
return ipList;
}
}
View.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" import="DSIP.*" import="java.util.ArrayList" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>DSIP.Insert</title>
</head>
<body>
<jsp:useBean id="ipList" scope="application" class="IPBeanMapper"/>
<jsp:useBean id="bean" scope="application" class="IPBean"/>
<form name="form1" method="post" action="viewServlet">
<table width="" border="">
<tr bgcolor="#0099FF">
<td width="90"><div align="center">ip</div></td>
<td width="90"><div align="center">username</div></td>
<td width="90"><div align="center">password</div></td>
<td width="90"><div align="center">maxRetry</div></td>
</tr>
<%
ArrayList<IPBean> list;
list = ipList.getIPList();
for (int i = 0; i < list.size(); i++){
bean = list.get(i);
%>
<tr>
<td><input name="ip" type="text" size="15" value="<%=list.getIp()%>"></td>
<td><input name="userName" type="text" size="15" value="<%=bean.getUserName()%>"></td>
<td><input name="password" type="text" size="15" value="<%=bean.getPassword()%>"></td>
<td><input name="maxRetry" type="text" size="15" value="<%=bean.getMaxRetry()%>"></td>
</tr>
<%
}
%>
</table>
</form>
</body>
</html>
и результат в моем браузере показывает, что первая и вторая запись являются идентичными, когда на самом деле не совпадают. Так что, пожалуйста, кто-нибудь, помогите мне показать реальные записи из базы данных.
Большое спасибо за помощь.
С уважением,
Файзал Ризки
4 ответа
+ Изменить
IPBean ipBean = new IPBean();
while (rs.next()){
в
while (rs.next()){
IPBean ipBean = new IPBean();
Это создаст новый экземпляр для каждой строки, что необходимо, в противном случае он будет переопределять данные в одном экземпляре.
Вам нужно поставить это IPBean ipBean = new IPBean();
внутри цикла
так что ваш код станет -
IPBeanMapper.java
while (rs.next()){
IPBean ipBean = new IPBean();
.
.
Проблема в том, что ссылка на объект добавляется в список. Таким образом, все начальные записи совпадают с последней записью.
Я думаю, что вам не нужно ставить весь
ipBean bean = new IPBean();
в петлю. Это было бы плохой практикой. Просто объявить
ipBean ipBean;
while(rs.next()){
bean = new ipBean();
}
IPBean ipBean = new IPBean();
while (rs.next()){
ipBean.setIp(rs.getString("IP"));
Вам нужно сделать новый экземпляр для каждой строки. Переместить new IPBean
внутри петли. В противном случае вы получите один и тот же экземпляр несколько раз в списке со значениями, которые вы установили в последней итерации.