2014-02-08 43 views
0

假设有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进行显示。

我的问题是:有没有更好的方式来循环和显示结果集,而没有相同的P_ID在不同的行的HTML表。

+0

请澄清你所说的“最有效”的意思。处理时间有效吗?清晰度和代码长度有效吗?内存使用效率高吗?通过网络发送的数据有效吗?另外,你在使用什么框架? – jpmc26

+0

我没有使用任何框架,我只是使用java JDBC来查询ResultSet。我只是想知道如何使用ResultSet显示上面的页面。 –

+0

你的问题说你有HTML。您没有使用Web框架或模板引擎来构建和交付它?你也没有回答我关于效率的问题。 – jpmc26

回答

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拍摄)

0

最好和有效的方法,你可以使用JQuery数据表插件,这将用于Java脚本和Html。

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

使用Java脚本,它工作的很好,你也可以动态地处理网页数据。

相关问题