假设有2个表:PERSON和TELEPHONE。
一个人可以有一部以上的电话。 电话号码只能由一个人拥有。
当我加入两个表时,返回的结果集是
P_ID NAME TEL_NO
1 ALVIN 911
1 ALVIN 912
1 ALVIN 913
2 ERIC 922
2 ERIC 923
但在我的HTML中,我想将页面显示为:
ID: 1 Name : ALVIN TEL_NO: 911, 912, 913
ID: 2 Name : ERIC TEL_NO: 922, 923
读取结果集并显示如上所示的数据的最有效方法是什么?
如果我遍历ResultSet并在页面上打印它。 它将具有多个具有相同名称的行,即ALVIN和ERIC。 但我想在同一行打印同一个人的所有TEL_NO。
我有一个存储PERSON详细信息的Java类。
public class Person {
public int id;
public String name;
public List<Integer> telNos = new ArrayList<Integer>();
}
List<Person> persons = new ArrayList<Person>;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
while(resultSet.next()) {
int pId = resultSet.getInt("P_ID");
String name = resultSet.getString("NAME");
int telNo = resultSet.getInt("TEL_NO");
if(map.containsKey(pId)){
Person person = persons.get(map.get(pId));
person.telNos.add(telNo);
} else {
Person person = new Person();
person.id = pId;
person.name = name;
person.telNos.add(telNo);
map.put(pId, persons.size());
persons.add(person);
}
}
最后,我将人员传递给JSP进行展示。
我的问题是:是否有更好的方法来循环和显示ResultSet,而不会在html表的不同行上使用相同的P_ID。
答案 0 :(得分:0)
最佳且高效的方式,您可以使用将在Java Script和Html中使用的JQuery Data Tables插件。
使用Java脚本,它可以在任何可以动态处理网页数据的地方正常工作。
答案 1 :(得分:0)
首先,我会运行两个查询来获取PERSON
和TELEPHONE
数据。像这样:
Map<Integer, Person> people = new HashMap<Integer, Person>();
ResultSet resultSet = [some query on PERSON];
while(resultSet.next()) {
Person p = [make a person]
people.add(p.id, p);
}
resultSet = [some query on TELEPHONE];
while(resultSet.next()) {
people.get(resultSet.getInt("P_ID")).telNos.add(resultSet.getInt("TEL_NO"));
}
这将为您提供一个干净的Person
个对象列表(无需重复)。如果性能是一个巨大的关注点(我说的是每秒至少数百个请求,可能更像是数千个请求),您可能需要坚持使用单个查询。在这种情况下,您的代码的想法或多或少都很好,但我会放弃ArrayList<Person>
并使用Map<Integer, Person>
这样:
Map<Integer, Person> people = new HashMap<Integer, Person>();
while(resultSet.next()) {
int pId = resultSet.getInt("P_ID");
if (!people.containsKey(pId)) {
people.add(pId, [build a new person]);
}
people.get(pId).telNos.add(resultSet.getInt("TEL_NO"));
}
您可以致电people.values()
来获取完整的人员列表。
然后在模板中,您可以遍历telNos
列表,将它们组合成逗号分隔列表。假设您已经遍历了您的人员,并且Person
中可以找到当前的p
,例如
<c:forEach items="#{p.telNos}" var="t" varStatus="loop"> ${t}${!loop.last ? ', ' : ''} </c:forEach>
(或多或少取自here)