繁体   English   中英

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

[英]What's the best way to map the resultset to object

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

最好且有效的方法是,您可以使用将在Java Script和HTML中使用的JQuery Data Tables插件。

  1. 在.html中,您必须定义Table。
  2. 在.js中,您可以将数据动态填充到表中。

使用Java脚本,它也可以在任何可以动态处理网页数据的地方正常工作。

首先,我将运行两个查询以获取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列表,将它们组合成一个逗号分隔的列表。 假设您已经遍历了您的人员,并且可以在p找到当前Person ,例如

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

(或多或少从这里获取

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM