程序语言已经由面向过程的模型全面转向为面向对象的模型,UML的出现更加革新了软件开发方法论。O/R Mapping的概念也就应运而生了。
为什么要提出O/R Mapping概念
程序语言已经由面向过程的模型全面转向为面向对象的模型,UML的出现更加革新了软件开发方法论。然而 数据库模型却从未随着开发语言的进步而随之革新,仍然使用面向关系的数据库模型。关系模型对现实世界的建模通常是不可能的,反过来讲,现实世界的对象实体 必须转变成行和列的格式存放在数据库中,这样使得面向对象的开发方法论的优势无法全面呈现出来,应用程序简洁性也遭受到损害。
O/R Mapping能避免繁琐的数据访问细节,对象和关系的行列转换都由O/R Mapping完成,不需要写过多的数据访问细节代码,面向对象的概念和关系数据之间的映射可抽象成为单个组件的职责,独立于应用程序之外。
3 O/R Mapping概念
O/R Mapping实际是通过一系列设计模式,使得原本需要硬编码在程序中的SQL语句可以由程序动态产生,或者将SQL语句写入XML配置文件中,通过API访问获取SQL语句返回的对象查询结果,而不是ResultSet这类对象。
这样带来的优点是业务代码与数据访问细节完全隔离,将数据访问抽取提升到组件的层次。
O/R Mapping的访问模型和设计模式主要分如下几类:
领域逻辑模型(Domain Logic Patterns)
数据源架构模式(Data Source Architectural Patterns)
对象-关系行为模式(Object-Relational Behavioral Patterns)
对象-关系结构模式(Object-Relational Structural Patterns)
对象-关系元数据映射模式(Object-Relational Metadata 、Mapping Patterns)
3.1 逻辑分类模型(Domain Logic Patterns)
A. Transaction Script
将一个业务逻辑处理计算过程和数据库查询等代码混合在一起
B. Domain Model
将业务处理的行为和获取数据的行为分离,更合理的利用OO思想
C. Table Module
每一张表有一个类来处理相关业务逻辑
D. Service Layer
建立一组业务操作方法,定义出应用程序和数据库访问之间的边界服务。
3.2 数据源架构分类模式(Data Source Architectural Patterns)
E. Table Data Gateway
单独的一个类,通过这个类访问和操作某一数据表,类中的每个方法都操作表的一条以上的记录行数,是一种纯粹的数据库操作
F. Row Data Gateway
由一个对象扮演Gateway,对应一数据库的一条记录。即将数据库存取操作交给内存中另外一个对象来执行。
这种模式常常和Domain Layer Patterns:Transaction Script一起使用。
G. Active Record
一个对象包装数据库表的一条记录。并加入一些如doInsert,doModify等方法。这就是ActiveRecord。而它的本质是Domain Model
区分Gateway和Active Record,主要是看SQL语句是在对象中管理还是在对象外管理。
H. Data Mapper
抽象了Row Data Gateway和Table Data Gateway,将数据库访问代码封装起来了
3.3 对象-关系行为模式(Object-Relational Behavioral Patterns)
I. Unit of Work
维护由事务或者并发引起的数据对象值被改变后的同步问题。
J. Identity Map
将所有根据主键获取的对象缓存起来。
K. Lazy Load
当需要数据时,才从数据库去查询获取数据。
3.4 对象-关系结构模式(Object-Relational Structural Patterns)
L. Identity Field
生成一个数据表主键值,主键的值由多种产生策略,可用数据库身的Sequence,也可自己实现。
M. Foreign Key Mapping
映射有外键关系的两个数据表所对应的持久化对象之间的引用关系
N. Association Table Mapping
查询具有关系表的对象列表
O. Dependent Mapping
脏数据检查更新
P. Embedded Value
一个对象可能被映射到多个表所对应的其它对象上
Q. Serialized LOB
大对象的find、update、insert操作
R. Single Table Inheritance
某一表的每个字段分别映射一个类的O/R继承关系
S. Class Table Inheritance
多个表都有各自的映射类,且这些类组成一颗继承树
T. Concrete Table Inheritance
多个表都有各自的映射类,且这些类组成一颗继承树,子表字段都继承父表的字段。
U. Inheritance Mappers
O/R映射关系的层次结构
3.5 对象-关系元数据映射模式(Object-Relational Metadata Mapping Patterns)
V. Metadata Mapping
维护对象/关系映射元数据的详细定义
W. Query Object
能产生SQL条件的对象
X. Repository
一个应用程序包含处理多个Domain对象,每个域对象可能映射多表或者单表甚至关系表,对这些Domain对象的增加、删除、修改会引起所映射表的记录 的变动,由于应用中Domain这类对象一定会很多,所以需要有一种方式管理这些域对象,Repository模式就是起到这种作用。
转自:http://gocom.primeton.com/blog3297_1368.htm