抽象的ORM该如何理解
ORM(Object Relational Mapping)对象关系映射
第一次接触这种概念,一堆英文字母的简写非常让人头疼,翻译成中文更是晦涩难懂,再看看最官方的定义,
对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。
完完全全懵掉了,这一堆汉字的排列组合拆开每个都认识,为什么组合起来像天书,于是为了解决这个头疼的问题,开始了大范围的搜索,目的是寻找一篇能让我看懂的文章,但是显然我失败了,所有的ORM相关的文章都难以理解,终于在不懈努力之下,稍微理解了一点什么是ORM。
什么是ORM?
一种新技术的产生一定是先存在问题,才能针对性的解决,在ORM之前,程序员会如何在程序中操作数据库呢,以Java为例,需要专门准备一个数据访问层,才能对数据进行操作,这种操作量是很大的,需要连接数据库、向数据库发送SQL语句、处理查询结果等操作。写好的数据访问代码,在实际应用中也难以一次通过,通常需要进行大量的调试,增加了很大的工作量。
无论是什么语言,通过SQL来对数据库进行访问都很复杂,为什么这种操作会很复杂呢?这就来源于困扰了程序员很多年的问题,“阻抗失配”问题。
什么又是阻抗失配呢?
阻抗失配
SQL语言是一种非面向对象的结构化查询语言,是基于解释执行的,使用起来非常简单,但是效率低。在实际开发过程中还是使用高级语言来编写实现,主流的就是JAVA一类开发语言。但是问题就来了,高级程序设计语言是过程化的,是面向单个数据的,从软件设计的概念不断发展来的,与从数理发展来的关系型数据库存在天然的界限和显著区别。尤其是JAVA这种纯面向对象的语言冲突尤其明显,这种天然的不匹配就称为“阻抗失配”。但是SQL语言由于有坚实的数学基础和强大的操控性和管理性,发展也非常完善,是不会被抛弃的,于是为了解决这种冲突提出了很多种方案。
解决方案
比较主流的市场提供的解决方案有四种:
1. 使用关系数据库的面向对象功能:治标不治本的方法。
2. 采用对象数据库
3. 采用后关系数据库
4. 采用对象-关系映射工具:优秀的面向对象开发人员为了避免操作数据库的复杂性和重复性的劳动,就开发出ORM工具,自动化映射关系对象,帮助开发者只关心对象,不必考虑数据库的结构。对于关系型数据库来说,这种努力的最大成果就是ORM。
既然ORM能够帮助开发人员解决关系-对象之间的映射关系,那与传统的方法有何区分呢,大体过程是什么呢?
下面是一个传统的,采用c#编写,执行SQL的过程。
var sql = 'SELECT id, first_name,last_name,phone,birth_date,sex,age,FROM persons WHERE id = 10';
var result = context.Persons.FromSqlRaw(sql).ToList();
var name = result[0]["first_name"];
与之对应的,使用ORM-API方式的代码大概是下面这种形式
var person = repository.GetPerson(10);
var first_name = person.GetFirstName();
ORM优缺点
优点:
1. 与传统方式比较,ORM能够有效减少重复和复杂的代码量,可以直接通过操作对象来操作数据,有效实现业务逻辑和数据的分离。
2. 实现复杂的业务逻辑和数据逻辑解耦合,避免因为更换数据库造成的数据访问层的全面推倒重建,提高代码的移植性。
缺点:
1. 不是所有的对象都能映射到数据库中,比如接口就不能映射。
2. ORM的很多操作对程序开发人员是透明的,高度抽象和模糊的,并不能清楚地了解在执行代码过程中真正发生了什么。