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

Java 将结果集映射到对象的最佳方式是什么,java,html,sql,Java,Html,Sql,假设有两张桌子:人和电话 一个人可以有多部电话。 一个电话号码只能由一个人拥有 当我加入这两个表时,返回的结果集是 P_ID姓名电话号码 1阿尔文911 1阿尔文912 1阿尔文913 2埃里克922 2埃里克923 但在我的HTML中,我希望将页面显示为: ID:1姓名:阿尔文电话号码:911、912、913 ID:2姓名:ERIC电话号码:922923 读取结果集并显示如上所示数据的最有效方法是什么 如果我循环浏览结果集并在页面上打印它。 它将有多个同名的行,它们是ALVIN和ERIC。 但

假设有两张桌子:人和电话

一个人可以有多部电话。 一个电话号码只能由一个人拥有

当我加入这两个表时,返回的结果集是

P_ID姓名电话号码 1阿尔文911 1阿尔文912 1阿尔文913 2埃里克922 2埃里克923 但在我的HTML中,我希望将页面显示为:

ID:1姓名:阿尔文电话号码:911、912、913 ID:2姓名:ERIC电话号码:922923 读取结果集并显示如上所示数据的最有效方法是什么

如果我循环浏览结果集并在页面上打印它。 它将有多个同名的行,它们是ALVIN和ERIC。 但是我想把同一个人的所有电话号码打印在同一行

我有一个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进行显示


我的问题是:是否有更好的方法来循环和显示结果集,而不必在html表的不同行上具有相同的p_ID。

最好且高效的方法是,您可以使用JQuery Data Tables插件,该插件将在Java脚本和html中使用

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

首先,我只需运行两个查询来获取人员和电话数据。大概是这样的:

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"));
}
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列表,将它们组合成逗号分隔的列表。假设你已经对你的人进行了循环,并且当前的人可以在p中找到,比如

<c:forEach items="#{p.telNos}" var="t" varStatus="loop"> ${t}${!loop.last ? ', ' : ''} </c:forEach>

多多少少摘自

请澄清您所说的最高效是什么意思。处理时间是否高效?在清晰度和代码长度方面高效?内存使用效率?通过网络发送的数据是否高效?另外,您使用的是什么框架?我没有使用任何框架,我只是使用JavaJDBC来查询结果集。我只是想知道如何使用ResultSet显示上面的页面。你的问题是你有HTML。您没有使用web框架或模板引擎来构建和交付它吗?您也没有回答我关于效率的问题。我使用JavaServlet将数据发送到JSP您使用的是什么数据库?有些数据库具有使这一过程更简单的功能。效率的含义?