如何使用 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 层之间的交互
从 Servlet 和 JDBC 迁移到 DAO 和 Spring,建议?