将结果集映射到对象的最佳方法是什么

时间:2014-02-08 04:03:59

标签: java html sql

假设有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。

2 个答案:

答案 0 :(得分:0)

最佳且高效的方式,您可以使用将在Java Script和Html中使用的JQuery Data Tables插件。

  1. 在.html中,您必须定义表。
  2. 在.js中,您可以动态地将数据填充到表中。
  3. 使用Java脚本,它可以在任何可以动态处理网页数据的地方正常工作。

答案 1 :(得分:0)

首先,我会运行两个查询来获取PERSONTELEPHONE数据。像这样:

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