我正在阅读Apress“从新手到专业开始”,我发现这一节讨论了DAO的使用。这个例子是非常简单,我在这里粘贴在src:设计/代码问题 - 从Apress的春天书
- UserAcccount.java - UserAccount Entity
- UserRole.java UserRole Entity
- UserAccountDao.java - UserAccount DAO
- JdbcUserAccountDaoImpl.java - JDBC Implementation of the UserAccount DAO
高级java/spring用户可以直接引用最后一个链接(jdbc执行的DAO)。我感兴趣的是这件作品的源代码:
public List<UserAccount> list() {
final List<UserAccount> list =
getTemplate().query(SELECT_ACCOUNTS, userMapper);
for(final UserAccount account : list) {
populateRoles(account);
}
return list;
}
这种方法应该是检索数据库中的所有UserAccounts的列表。通过执行查询“SELECT_ACCOUNTS”获得的第一个列表仅获取UserAccount表中的UserAccount详细信息。然而UserRoles在不同的桌子上。从上面的代码片段可以清楚地看出,对于每个UserAccount,populateRoles都会被执行。 populateRules(帐户)依次使用用户标识查询角色表。实际上,如果您有1000个用户,则此代码将发出1,000次准备好的声明!
所以来这里的问题:
第1部分:
是不是一个不好的做法?有没有简单的方法呢?你通常会怎么做?这里最好的做法是什么?
第2部分:
你如何决定的DAO?每个实体是否应该有一个DAO?例如,在上面的例子中,UserAccount和UserRoles代表两个实体。在数据库方面,你有USERS,ROLES表和USERS_ROLES映射表。那么,你如何决定要创建哪些DAO?它取决于要求吗?还是应该在对象相关时创建DAO(在数据库中有映射表?)?
XXX.populateRoles(这个) - 这意味着,你需要从实体调用你的DAO!?那有意义吗? – Jay 2010-03-10 14:00:50
我想不是,但我不知道你是如何正确开发你的应用程序的。您可以将该代码移动到您的服务层的实用程序方法中,例如'UserAccountUtil.getRoles(UserAccount ua)'。我只是建议你如何避免数据库查询洪水。你如何编写你的应用程序作为一个整体(DAO,模型等)是你的工作。 ;) – dimitarvp 2010-03-10 14:12:28