zl程序教程

您现在的位置是:首页 >  前端

当前栏目

Atitit orm 之道 艾龙著 1. 一、ORM的由来 1 2. ORM的组成:      2 3.  常见的ORM框架:      3 4. 、ORM与数据持久化的关系 3 5. Atitit

框架数据 常见 atitit 关系 之道 持久 组成
2023-09-14 09:03:25 时间

Atitit orm 之道 艾龙著

 

1. 一、ORM的由来 1

2. ORM的组成:      2

3.  常见的ORM框架:      3

4. ORM与数据持久化的关系 3

5. Atitit.orm的实现类型   Data Mapper  vs  Active Record 3

5.1. Data Mapper  vs  Active Record 3

5.2. 事务脚本 (Transaction Script 4

5.3. Data Mapper hibernage 4

5.4.  Data Mapper ORM   mybatis 4

5.5. Active Record 类型的 ORM  4

5.6. 活动记录(Active Record 5

5.7. 表数据入口(Table Data Gateway 5

6. 循序渐进使用 事务脚本 :活动记录 领域模型 6

7. 参考资料 7

7.1. ORM知多少 - 全力奔跑,梦在彼岸 - CSDN博客.mhtml 7

7.2. ORM选型—DataMapper VS ActiveRecord - CSDN博客.mhtml 7

7.3. [转编] 企业架构模式之领域逻辑模式的实现(事务脚本、领域模型、表模块、活动记录) - 范远 - 博客园.mhtml 7

 

1. 一、ORM的由来

  采用ORM之前,程序员采用JDBC作为数据访问层,虽然JDBC是跨平台的,但是在使用中仍然存在一些问题:

· 代码繁琐,容易出错 
    程序员需要耗费大量的时间、精力去编写具体的数据库访问语句,还要担心大量重复的代码中是否有遗漏,并不能集中精力于业务逻辑开发上面。

· 可维护性低 
    关系数据对象之间,存在各种关系,包括1对1、1对多、多对1、多对多、级联等,在数据库对象更新时,如果采用JDBC编程,程序员必须十分小心处理这些关系,在后期维护的时候也是很痛苦的。

· 层次划分不明确 
    使用JDBC编程时,程序员必须知道后台用的是什么数据库、要操作哪些表、表中都有哪些字段、字段类型、表间的关系等,每个程序员除了关注业务逻辑的同时还在兼职DBA的工作。

· 性能低 
But— 
ORM通常更容易开发跨平台的应用程序。 
ORM是对JDBC的封装,解决了使用JDBC出现的上述问题。

2. ORM的组成: 
   

 一个对持久类对象进行CURD操作的API; 
    一个语言或API用来规定与类和类属性相关的查询; 
    一个规定mapping metadata的工具; 
    一种技术可以让ORM的实现同事务对象一起进行dirty checking,lazy association fetching以及其他的优化操作。 
 

3.  常见的ORM框架: 
   

 .NET —— entity framework 、Linq to Sql 
    Java —— Hibernate、Mybatis、TopLink

 

4. ORM与数据持久化的关系

  数据持久化:将内存中的数据模型转换成存储模型,以及将存储模型转换为内存中的数据魔性的统称。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。 
  ORM是一个数据持久化框架,实现了JPA接口。

 

5. Atitit.orm的实现类型   Data Mapper  vs  Active Record

 

5.1.  Data Mapper  vs  Active Record

ORM选型—DataMapper VS ActiveRecord -

 

5.2. 事务脚本 (Transaction Script

我们用得最多就是事务脚本方式(像微软的Petshop4.0,很多国内的三层结构代码生成工具生成的系统,而且这种方式很多公司,很多企业级的项目都在用,还有一些框架引导你用这种方式实现)。这种方式最大的特点就是:简单实用。

为什么叫事务脚本(Transaction scripts)呢?也就是实现一个功能,就直接写一个过程(方法),系统的业务就是分散在一个个这样的过程里,像早期用ASP做的大部分系统,一些使用存储过程系统等,尤其是使用存储过程系统,所有业务逻辑都写在存储过程里,很明显的事务脚本实现方式。想一想,我们在业务层实现一个业务时,一般就是这么做的,要实现一个什么功能,在脑子里想一想,然后找到那个对应的类,然后再定义一个方法,加上一堆参数

 

5.3.  Data Mapper hibernage

5.4.  Data Mapper ORM   mybatis

ORM是Object和Relation之间的映射,包括Object->Relation和Relation->Object两方面。Hibernate是个完整的ORM框架,而MyBatis完成的是Relation->Object,也就是其所说的data mapper framework

Mybatis是OXM设计 不是对象关系映射 你用过就知道 只是用xml标记然后用java查找占位符 说白了就是给你在java和sql之间提供更灵活的映射方案

iBATIS非常简单易学,Hibernate相对较复杂,门槛较高。

5.5. Active Record 类型的 ORM 

 

Active Record是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。Active RecordRow Gateway十分相似,但前者是领域模型,后者是一种数据源模式。关系型数据库往往通过外键来表述实体关系,Active Record在数据源层面上也将这种关系映射为对象的关联和聚集。在Martin Fowler2003年出版的《企业应用架构模式》一书中详细叙述并命名了本模式。[1]

 

Active Record适合非常简单的领域需求,尤其在领域模型和数据库模型十分相似的情况下。如果遇到更加复杂的领域模型结构(例如用到继承、策略的领域模型),往往需要使用分离数据源的领域模型,结合Data Mapper(数据映射器)使用。

Active Record驱动框架一般兼有ORM框架的功能,但Active Record不是简单的ORM,正如和Row Gateway的区别。著名的例子是全栈(Full StackWeb开发框架Ruby on Rails,其默认使用一个纯Ruby写成的Active Record框架来驱动MVC中的模型层

 Data Mapper

相比DataMapper,ActiveRecord少了一层mapper,但是业务逻辑中的每个类都需要继承统一的基类Model,Model中包含了增删查改涉及到的接口,如save、find等。业务对象Object与数据库Record之间依赖字段名和列属性衔接。整个操作的结构图为:

 

 

5.6. 活动记录(Active Record

活动记录 行数据入口 很类似。二者的差别是 行数据入口 只有数据库访问而 活动记录 是即有数据库访问又有领域逻辑。在 行数据入口 中,我们一般使用两个类,而在活动记录中,一般则无此限制,通常情况下,一个类可能会显得更清爽。

领域模型,一般和 活动记录 或者 数据映射器 协作。

 

5.7. 表数据入口(Table Data Gateway

表数据入口提供了用于访问单个表或者视图(也包含了联表查询)的所有SQL,通常一个表一个类。其它代码通过它来实现对数据库的交互。基于这个特点,表数据入口和事务脚本代码以及表模块结合的很好。

在查询时候,表数据接口可以返回数据集 或者 DTO 或者 DTO列表。在 事务脚本 代码中已经阐述过了 DTO 以及 DTO 的列表这种形式。但是使用 DTO 这种形式,带来的一个问题是:到处衍生的 DTO,那么,如何减少到处衍生的 DTO 的,见这里《》。

在传统做法中,表数据入口和领域模型不一起使用,使用领域模型,一般使用数据映射器。

 

6. 循序渐进使用 事务脚本 :活动记录 领域模型

在软件开发中,初级的做法是:事务脚本;

比较高级一点的做法是:活动记录。一般,当发现事务脚本的代码已经复杂到难以维护的时候,则可以逐步创建活动记录,然后慢慢为它们添加行为,即:把表包装成为活动记录,然后添加领域逻辑。

最复杂而高级的做法是:领域模型。

由上面的分析可知,DataMapper使用单独的Mapper处理对象到数据库的增删查改,ActiveRecord需要类继承统一的Model类来完成这些操作。也就是说,DataMapper对业务代码侵入性小,而ActiveRecord直接在对象上操作,代码编写更方便一些。 因此,笔者认为,ActiveRecord更加适合快速开发成型的短期简单项目,而DataMapper更加适合长线开发

 

 

7. 参考资料

7.1. ORM知多少 - 全力奔跑,梦在彼岸 - CSDN博客.mhtml

7.2. ORM选型—DataMapper VS ActiveRecord - CSDN博客.mhtml

7.3. [转编] 企业架构模式之领域逻辑模式的实现(事务脚本、领域模型、表模块、活动记录) - 范远 - 博客园.mhtml