2010-10-29 71 views
2

我的數據訪問類通常有一個名爲loadDataToEntity或類似的方法。此方法將結果集作爲實例並填充傳遞給客戶端使用的實體類。檢索數據庫數據 - 常規檢索方法?

這是不錯的,因爲所有使用存儲過程來檢索數據的方法可以直接傳遞結果集到loadDataToEntity方法,並取回一個實體。

所以這是減少代碼的好辦法,但我經常聽到,你應該獲取儘可能少的列成爲可能。要使用我的通用方法,所有存儲過程都需要獲取loadDataToEntity()所需的所有列。另外,當列被添加到表中並且被存儲過程檢索時,所有其他存儲過程需要被更改並且還檢索該列。

我不知道是否有更好的方法來實現兩者的一般方法,並取回有時取決於存儲過程的列數不同?


public Entity getById(int id) 
{  
    ResultSet rs; 
    //call stored procedure A and stuff 
    return loadDataToEntity(rs); 
} 
public Entity getByName(String name) 
{ 
    ResultSet rs; 
    //call stored procedure B and stuff 
    return loadDataToEntity(rs); 
} 
public Entity loadDataToEntity(ResultSet rs) 
{ 
    // fill and return entity here 
} 

回答

1

這實際上取決於您如何組織數據庫中不同類別的實體以及如何檢索它們。例如,如果您有一個可以包含許多實體類型的大型非規範化表,每種類型都需要填充不同的列組合,那麼如果您希望在單個查詢中檢索所有實體類型,則必須檢索所有列。

相反,如果你在一個標準化的形式組織數據庫架構,很可能有一個父實體表(可能只包含實體ID)和多個子表,每個實體類型之一。在這種情況下,您可以運行多個定製查詢來檢索各種實體類型;例如

select E.EntityId, S.EntityName, S.EntityAge 
from Entity E 
inner join SubEntity S on E.EntityId = S.EntityId 

select E.EntityId, A.EntityAddress, A.EntityGender 
from Entity E 
inner join AnotherSubEntity A on E.EntityId = S.EntityId 

權衡這種第二種方法是運行多個查詢,這實際上可能是慢的需要。但是,我通過在應用程序中並行運行查詢並將結果多路複用在應用程序中解決了這個問題。

+0

是的,第二種方法可能會更適合我,因爲我幾乎總是使用規範化的數據庫。 示例:表用戶 queryA:獲取檢查登錄驗證所需的用戶信息。需要列a,b和c。 queryB:獲取下訂單所需的用戶信息。需要列a,c和d。 在這種情況下,如果有一個在表中只有4列可能是最好有在一個實體對象加載這些4列的一般方法和既有查詢A和B檢索所有4列。 – KTrum 2010-11-01 12:16:52

+0

@Karl - 在不知道應用程序的確切細節的情況下很難給出建議,但我總是建議僅針對需要的列進行查詢,而不是運行「select *」。這使得您更容易對模式進行更改,因爲您會「快速失敗」。它還允許您在使用SQL分析工具時更容易地計算出發生了什麼,因爲您可以更輕鬆地建立行爲模式。 – Adamski 2010-11-01 16:11:08