如何使用 JDBC 处理 DAO 之间的交互? [复制]

Posted

技术标签:

【中文标题】如何使用 JDBC 处理 DAO 之间的交互? [复制]【英文标题】:How to handle interaction between DAOs using JDBC? [duplicate] 【发布时间】:2018-11-21 02:55:29 【问题描述】:

我在弄清楚如何使用 JDBC 处理应用程序上的实体之间的交互时遇到问题。以前我使用过 Hibernate,但这不是一个真正的问题,因为几乎所有事情都可以自动或通过注释解决。现在,使用 JDBC 就没有那么神奇了。

假设我有这些课程:

class A
    private String name;
    private List<B> bs;
    private C c;


class AService
    private ADao aDao;
    void save(A a)
        aDao.persist(a);
    


class ADao
    void persist(A a)
        //open connection and autocommit false
        //persist C
        //persist B's
        //persist A
        //commit
    

B 和 C 有各自的 DAO 和服务。 现在,据我所知,您不应该将 DAO 相互混合......这意味着我不应该在 ADao 中使用 BDao 和/或 CDao,而只使用它们的服务。

如果这是真的,我应该如何实现所需的行为?我可以在事务上持久化多个实体吗?服务不应该知道任何关于连接或任何东西......这些是我无法传播到业务层的详细实现。

到目前为止,我还没有在网上找到任何东西...所有示例都是针对单个实体的,而我能想到的唯一其他解决方案就是在我的其他 DAO 上简单地复制代码。

非常感谢您能提供的任何帮助,以及相关的书籍或好资料。我找到了一些关于 jdbc 的书.. 但坦率地说,它们并不是那么好......其中一些甚至将 DAO 传播到表示层.. :/

【问题讨论】:

google 的第一个结果docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html 【参考方案1】:

不存在 DAO 不能处理多个实体的做法。如果 DAO 应该处理一个和一个实体,那么它应该只接受一个实体,而不是您的示例中的嵌套实体树。

所以你有两个选择。

    在 DAO 层解耦 A、B、C。他们每个人都有一个 DAO。您已经看到了持久化一个 bean 的示例。服务层通过根据需要调用每个 DAO 来负责编排所有 bean 的持久性。它还负责维护关系。服务层还将所有调用包装在一个事务中。

    如果实体 A、B 和 C 密切相关,则拥有您现在拥有的实体。有一个 DAO 一起处理 A、B 和 C。选项 1 中服务层所做的任何事情都可以推送到 DAO 层。

除非您的项目包含很少的实体,或者您只是在玩 jdbc,否则我建议您使用 JPA/Hibernate 之类的东西。我知道 JPA 很痛苦,但普通的 jdbc 将是一场噩梦。

【讨论】:

【参考方案2】:

您愿意使用 EJB 吗?他们可以很好地处理业务层逻辑(如 DB START .. ejb function .. DB COMMIT)。我知道它们已经过时了,但我个人认为它们占有一席之地。

事务是业务层问题,而不是 DAO/数据层问题。

【讨论】:

嗨,我不想使用框架/库来解决设计问题。我宁愿学习如何正确解决它。关于您最后的陈述,您能否提供一本书、链接或示例来教育自己如何解决这个问题? EJB 是 Java 的标准部分(Java EE,不是 Java SE)。您已经能够在 JDK 中使用它们而无需添加库。他们为您处理交易。一个好的开始是docs.oracle.com/javaee/6/tutorial/doc/gijsz.html 或***.com/questions/12872683/…。 不过,这不是我的问题的答案。还是谢谢你。 您能否详细说明为什么它不是答案?我是新来的,得到了​​惊人的反对票,所以我想做得更好。

以上是关于如何使用 JDBC 处理 DAO 之间的交互? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 应用程序中 WCF、DAO 和 DTO 层之间的交互

使用普通 JDBC 在 DAO 或服务层中进行事务处理

Spring数据访问和数据访问层与业务或服务层之间的交互

从 Servlet 和 JDBC 迁移到 DAO 和 Spring,建议?

在 Hibernate 的 SessionFactory 和 JDBC DAO 之间共享连接的最佳方式是啥?

如何使用 JDBC 创建事务性 DAO