ORM和DAL之间有什么区别?

ORM和DAL之间有什么区别?,orm,data-access-layer,Orm,Data Access Layer,我读过这两本书,但它让我更加困惑。我试图找出不同之处(和相似之处),但无法说服自己。它们都是业务逻辑和数据库之间的中间层。有区别还是相同?在Java中,当提到对象关系映射时,最常见的场景是将表映射到Java对象。一个非常流行的对象关系映射器是Hibernate。假设你有一排桌子的汽车。当然,它有很多列,例如Year、Make、Model等。ORM会将这个表行映射到一个Car.java类,其中的数据成员对应于该行的列 映射发生在数据访问层内部,该层由执行转换的类组成。此外,您可能拥有服务类,这些服

我读过这两本书,但它让我更加困惑。我试图找出不同之处(和相似之处),但无法说服自己。它们都是业务逻辑和数据库之间的中间层。有区别还是相同?

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


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

ORM是一种通用的编程方法,它以一种将系统中的数据显示(并允许您使用)为所选编程语言中的对象的方式来处理系统中的数据。即使数据来自与所选编程语言无关的源。通过对象“贴面”与数据交互的抽象概念是ORM

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

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

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

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

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

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