2014-02-08 44 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腳本,它工作的很好,你也可以動態地處理網頁數據。

相關問題