DAO调用DAO,DAO调用服务还是SQL join?

Posted

技术标签:

【中文标题】DAO调用DAO,DAO调用服务还是SQL join?【英文标题】:DAO call DAO, DAO call service or SQL join? 【发布时间】:2019-07-31 13:32:26 【问题描述】:

所以我正在编写一个个人项目来学习 Web 编程,并且遇到了 DAO 模式。我构建了一些类(模型),并且像几乎所有程序一样,它们是嵌套的(例如:Payment 类引用了 Author 实例)。 仅供参考,我没有使用任何映射器(将在以后的迭代中添加它们,我使用的是 JDBC,而不是 JPA)。

我的问题是这样的:

当我创建 PaymentJdbcDao 时,我有一个方法会返回一些付款,但为了从数据库存储的对象创建此付款,我还必须访问作者(存储在单独的表中)。

我是否应该从 PaymentJdbcDao 调用 UserJdbcDao 以获取付款的作者,我是否应该使用联接更改查询以从两个实体中检索字段,如果 PaymentJdbcDao 调用 UserService(我认为这不好,因为服务位于 daos 之上的层上),还是应该将作者引用作为一个对象删除并只保留对 author_id 的引用?

上面的哪一个是更合适的方法来实现这一点?或者还有其他更好的做法吗?

谢谢。

【问题讨论】:

如果对您有帮助,请标记为正确答案 【参考方案1】:

我将我的 DAO (DataAccessObjects) 称为“存储库”。

Spring Data JPA 也在这样做。

所以我会创建一个 UserRepository 和一个 PaymentRepository。

存储库可以被其他存储库或服务调用。

服务不应该被存储库调用。

UI -> 服务 -> 存储库。

您的 PaymentRepository 可能会返回这样的实体

public class PaymentEntity
    private long id;
    private DateTime dateTime;
    private UserEntity user;

您的 UserRepository 可以返回这样的实体

public class UserEntity
    private long id;
    private DateTime lastLogin;
    private List<PaymentEntity> payments;

您的存储库可能如下所示。

public interface PaymentRepository

    PaymentEntity getPaymentById(long id);
    List<PaymentEntity> getAllPayments();



public interface UserRepository

    UserEntity getUserById(long id);
    List<UserEntity> getAllUsers();

因此,您的 PaymentRepository 将调用 UserRepository 以获取用户进行付款。

您的 UserRepository 会调用 PaymentRepository 来获取所有用户的付款

希望能帮到你

【讨论】:

以上是关于DAO调用DAO,DAO调用服务还是SQL join?的主要内容,如果未能解决你的问题,请参考以下文章

从另一个服务调用服务 vs dao

mybatis怎么知道dao层调用了实体.xml里面哪个方法

如何在 servlet 中调用 DAO 方法来提取查询结果

spring mvc中的单元测试

在 REST 调用 TOMCAT 中访问 DAO

单元测试 DAO