ORM 和 DAL 有啥区别?

Posted

技术标签:

【中文标题】ORM 和 DAL 有啥区别?【英文标题】:What is the difference between ORM and DAL?ORM 和 DAL 有什么区别? 【发布时间】:2018-09-05 02:46:21 【问题描述】:

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

【问题讨论】:

【参考方案1】:

ORM(对象/关系映射器):

它是一个库/工具,它执行输入 SQL 查询(一些 ORM 也为您生成查询)并将输出 DataReader(或其他语言中的等效项)转换(映射)为您的强类型对象。这是任何 ORM 的基本特征。 也就是说,它充当数据存储和应用程序之间的层。 ORM 的核心作用是映射;它总是(大部分?)返回强类型对象。在极少数情况下,它可能会返回 intstring 等语言提供的基本数据类型的值。 这与应用程序无关;除了您必须为每个应用程序/数据存储单独配置它。 这仅处理 RDBMS。 一些高级 ORM(全 ORM)可以用作 DAL;这主要是一个设计决定。 由于与应用程序无关,这无法实现您的特定持久性逻辑。

DAL(数据访问层):

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

【讨论】:

【参考方案2】:

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

另一方面,DAL 只是编程语言提供的整个集合的名称,它使处理存储的数据变得更容易。它实际上是一个方便的术语,用于谈论“所有用于处理存储数据的 API”。

并将其联系在一起:“您选择的编程语言的数据访问层可以使用对象-关系映射。”

【讨论】:

所以基本上 DAO 也只是这个“API 集合”即 DAL 的一部分? 从某种意义上说,如果您使用对象-关系映射方法,根据定义,这意味着您在某处有一个数据访问对象作为数据访问层的一部分。【参考方案3】:

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

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

【讨论】:

那么如果 Hibernate 是一个 ORM,它是否也包含 DAL?我知道 ORM 将 DB 行转换为对象,然后使用 DAO 在对象和 DB 之间进行映射。 不,相反。 DAL 是用于访问/修改数据的实用程序层。在这些实用程序中,ORM 有助于执行它们各自的功能。 知道了。所以基本上 DAL 是 DAO (kindof) 对吧? 让我试着给你一个完整的例子。在您的 Service.java 中,您将拥有一个或多个 sampleDAOImpl.java 类作为成员。如果我们假设 Hibernate,您的 DAOImpl 类将具有执行 hql 查询以获取数据的实用方法。在后台 Hibernate(您的 ORM)理解 hql 查询并处理与数据库的对话,此外,它执行从表行到 Java 对象的映射。我所描述的是人们所说的数据访问层。没有一个组件构成数据访问层,它是协同工作的类的组合。 知道了,所以基本上 DAL 是一个“架构名称”,而 DAO 是一个类实现。

以上是关于ORM 和 DAL 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

ORM注入和SQL注入有啥区别?

Rails 中的 Active Record 和 ORM 有啥区别?

orm 和 ADO.net 有啥区别?

laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别

三层架构和mvc模式有啥关系

POJO和DAO有啥区别