2010-10-29 73 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