在我的案例中是否值得创建数据访问层?

Is it worth creating a data access layer in my case?

场景:

假设我必须建立一个网站来与遗留数据库进行交互。供应商不会很快被更换。性能是必需的,对于大多数表,我们只会处理列的子集,这些列可能因查询而异,因此我们大多不会处理整个 "entities".

问题:

是否值得在服务和表示层之外创建一个专用的数据访问层?或者直接与服务层的 JDBC 交互以避免多重映射(在本例中为 2 个)更正确?

总结:

DAL <---> BL <---> 介绍 VS BL/DAL 混合 <---> 演示文稿

是的。

始终将 JDBC 隐藏到专用数据访问层中是个好主意。您也可以将其用作 ACL(请参阅域驱动设计 - 反腐败层),它作为映射器以您想要操作的方式表示遗留数据。

除了极少数微不足道的 CRUD 数据库,通常数据库模型(也称为存储模型)不是 1:1 域模型的表示(您在对象中表示应用程序中数据的方式)。因此 "i need only a few columns" 问题在任何项目中都是完全有效的。

15 年前,ORM 映射器(例如 Hibernate、Linq)开始提供一种向开发人员隐藏此 "complexity" 的方法,给人一种不需要考虑存储模型的错误印象,并且存储模型可以从域模型中推断出来。然而,该解决方案对性能造成了极其严重的影响 - 数据库架构师很容易理解,但很难向大多数 Java 程序员解释 :)

5 年前,领域驱动设计方法开始对此不那么紧张,明确指出 "same" 数据可以在不同的子系统(例如在数据库中)中以不同的方式建模,这就是全部好的,因为我们可以将数据转换为我们的需要,即使数据来自 XML 或 JSON 或具有奇怪的列名或其他邪恶。这种方法称为反腐败层 (ACL) - 特别是当您 "translate" 在表示相同数据的不同系统之间时代码中的专用位置。

在您的情况下,与其将此数据访问层用作仅 1:1 将所有 table 列读入 class 的无脑 DAO,您还可以做更多:

  • 创建一个存储库(因此一个单独的 class 来处理数据操作)
  • 存储库接受并检索您格式的数据(仅正确的列等)
  • 使用 select 语句来选择您需要的数据,加入其他遗留 tables 并使用 case/decode 语句以您需要的格式获取数据,(因此转换存储数据模型到您的域数据模型)
  • 更新或插入内容时,在此 ACL 代码中,您可以根据存储数据模型自由 insert/update 多个 table(因此将域数据模型转换为存储数据模型)