ORM 和 DAL 有什么区别?

What is the difference between ORM and DAL?

我都读过,但它让我更加困惑。我试图找到差异(和相似之处),但无法说服自己。它们都是业务逻辑和数据库之间的中间层。有区别还是一样?

在 Java 中,引用对象关系映射的最常见场景是 映射 table 到 Java 的行为对象。一种非常流行的对象关系映射器是 Hibernate。假设您有 table 排的汽车。当然它有很多列,例如 Year、Make、Model 等。ORM 会将此 table row 映射到 Car.java class 具有对应于行的列的数据成员。

映射发生在数据访问层内部,该层由执行转换的 class(es) 组成。此外,您可能拥有服务 classes,这些服务根据特定条件(查询)提供某些 Java 对象。一个例子是假设您有一个包含用户的应用程序。您可能会使用 UserService.java class 和 getAllUsersSortedByLastName() class 来执行该操作。这将涉及利用活动数据库连接,执行正确的查询以获取用户行,将这些用户 放入用户 Java 对象,将那些 User.java 个对象放在一个列表中,如果需要,最后在返回之前处理该列表。执行我描述的操作的能力都在您的应用程序的数据访问层中。您将使用 ORM 执行 table 行和 Java 对象之间的映射,反之亦然。

ORM 是一种通用的编程方法,以处理系统中的数据为中心,以某种方式将它们呈现(并让您使用它们)作为您选择的编程语言中的对象。即使数据来自与您选择的编程语言无关的来源。通过对象"veneer"与数据交互的抽象概念是ORM。

另一方面,DAL 只是编程语言提供的整个事物集合的名称,它使处理存储的数据变得更加容易。它实际上是谈论 "all the APIs for dealing with stored data".

的方便术语

并将其捆绑在一起:"The Data Access Layer for your chosen programming language may use Object-Relational mapping."

ORM(Object/Relational映射器):

  • 它是一个 library/tool 执行输入 SQL 查询(一些 ORM 也为您生成查询)并将输出 DataReader(或其他语言的等效项)转换(映射)到您的强键入的对象。这是任何 ORM 的基本特征。
  • 也就是说,它充当数据存储和应用程序之间的层。
  • ORM的核心作用是映射;它总是(主要是?)return 强类型对象。在极少数情况下,它可能 return 由语言提供的基本数据类型的值,如 intstring
  • 这与应用程序无关;除了您必须为每个 application/data 商店单独配置。
  • 这只涉及 RDBMS。
  • 一些高级的ORM(full-ORM)可以用作DAL;这主要是一个设计决定。
  • 与应用程序无关,这无法实现您的特定持久性逻辑。

DAL(数据访问层):

  • 这是一个处理您所有数据需求的层。但这与ORM不同。
  • 实际上,此 可以在内部使用 ORM 进行任何 RDBMS 通信。尽管也可以在不使用任何 ORM 的情况下设计 DAL。
  • DAL 可以 return 强类型对象,但并非总是必要。
  • DAL 可以与任何形式的数据存储进行通信,包括 Web API、XML、RDBMS。
  • 映射可能是也可能不是 DAL 的一部分,具体取决于它的设计方式。
  • 这是特定于应用程序的。
  • 有不同的模式可用于将 DAL 实现为数据访问对象或存储库。
  • 专为特定应用而设计,这可能包括您的特定持久性逻辑,如数据加密。