技术解析:到底什么是 O/R Mapper

技术解析:到底什么是 O/R Mapper
(2004.01.07)   来自:Donews   
 
 
 
 
 

来源:霍炬 原创-IT


到底什么是 O/R Mapper  为什么要翻译这个?

一次和一个群里面的朋友聊天,有人说最近发现了新的设计数据库方法,就是把数据库的列和对象属性一一对应,这样设计很方便。我说寒,那有这么容易的,实际情况复杂去了,怎么能一一对应。

然后老兄大骂了我不懂,然后找来一篇文章作论据,我打开看看,是讲O/R Mapper的。我寒的不行,没敢再多少话。

印象中始终缺乏好的关于O/R Mapper的中文文章,所以造成很多人概念不清。O/R Mapper到底是什么?

Steve Eichert这一系列文章讲得不错。打算跟着翻译一下,给自己增加点认识。当然也希望对更多的人有所帮助。

原文:http://dotnetjunkies.com/weblog/seichert/posts/4677.aspx

到底什么是 O/R Mapper

 

  最近社区里面讨论O/R Mapper的越来越多了,但是,到底什么是O/R Mapper呢?
  让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。

  当你开发一个应用程序的时候(不使用O/R Mapper),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。
  如果打开你最近的程序,看看DAL代码,你肯定会看到很多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为SqlCommand对象添加SqlParameter,把所有属性和对象对应,设置SqlCommand的CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的写这些代码。
  除此之外,还有更好的办法吗?有,引入一个O/R Mapper。实质上,一个O/R Mapper会为你生成DAL。与其自己写DAL代码,不如用O/R Mapper。你用O/R Mapper保存,删除,读取对象,O/RMapper负责生成SQL,你只需要关心对象就好。

  好,还有什么问题?哈哈,我从没有讨论过Mpaaer这个部分。我们知道,我们有对象,有关系数据库。在他们之间我们有自己的O/R Mapper。很多时候,对象的属性不可能100%和数据库的列相符。为了把我们的customer对象的FirstName属性保存到数据库的t_Customer表中的first_name列,我们需要做一些"Mapping"。我们需要让O/R Mapper保存FirstName属性到t_Customer表中的first_name列。我们在O/R Mapper中设置这些Mapping。除了mapping对象属性,我们还需要定义keys以及对象关系。

  优秀的O/R Mappers会提供设计器,帮助我们设置所有需要的mapping。一些不成熟的(大多是FREE的)用xml文件来定义对象和数据库的mappings,另一些用自定义属性完成。通过什么方法mapping不是最重要的,重要的是这种O/R Mapper允许我们设置哪些mappings.

  定义好所有的mapping之后,这个O/R Mapper可以帮我们做很多的工作。通过这些mappings,这个O/R Mapper可以生成所有的关于对象保存,删除,读取的SQL语句,我们不再需要写那么多行的DAL代码了。
  O/R Mappers远不止我所讨论的这些内容,在以后的贴子中,我将继续讨论O/R Mappers提供的其他功能。

 
  


/*
   作者:飞鹰
  
   ASP酷技术资讯网(www.ASPCool.com)版权所有,如转载,请保留此信息.
   */
  
  1. 业务实体层的设计方案选择
  1) 业务实体层的作用
  一般的应用程序分层的结构如下:
  
  可见,在分层的时候,我们会增加一个实体层,它的作用如下:
  ① 将显示数据和实际的存储区域隔离,保证了业务的独立性,提高了可重用性。
  ② 在业务层和表现层之间传递数据。(如果没有实体层的话,我们需要把表的每个字段作为一个参数在它们之间传递,如果修改的话,将需要影响到程序的各个层)
  ③ 提供更大的可收缩性。
  
  2) 业务实体层的几种选择方案及其优缺点。
  在.NET环境下实现业务实体有下面的几种选择:
  ① DataReader BE 具有最快的读取速度,用于只读的场合,不具有OO的概念。
  ② XML BE 可以与XML Reader和DataSet转换。缺点:性能低,验证、解析、显示、排序等都很复杂。
  ③ Generic DataSet BE 优点:数据绑定等。缺点:客户端必须通过集合来获取数据,没有类型,实例化开销大,调度性能低。
  ④ Typed DataSet BE 优点:由类型,可以进行类型检查。缺点:只能从DataSet继承,部署不方便,可扩展性差,实例化开销大,调度性能低。
  ⑤ Custom BE 优点:性能调优,代码更具有可读性,用自定义实体类定义一个良好的接口,将复杂问题隐藏在其中。缺点:设计开发都很复杂,需要自己去实现CURD操作,自己去实现数据绑定,工作量很大。
  ⑥ O/R Mapping的实现 它具有自定义类的所有优点,同时实现了CRUD,数据绑定等操作。
  2. 什么是O/R Mapping?
  ORM,即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
     让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
  当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。
     如果打开你最近的程序,看看DAL代码,你肯定会看到很多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为SqlCommand对象添加SqlParameter,把所有属性和对象对应,设置SqlCommand的CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的写这些代码。
     除此之外,还有更好的办法吗?有,引入一个O/R Mapping。实质上,一个O/R Mapping会为你生成DAL。与其自己写DAL代码,不如用O/R Mapping。你用O/R Mapping保存,删除,读取对象,O/R Mapping负责生成SQL,你只需要关心对象就好。
  
  3. 为什么要采用O/R Mapping?
  1) 提高学习开发效率,降低开发成本。
  使用ORM可以大大降低学习和开发成本,现代技术的发展,使得我们不得不不停地学习。我们不仅要学习面向对象、UML、设计模式等知识,而且还需要学习Sql Server、ADO.NET、DataSet、DataReader等知识。而在实际的开发中,真正对客户有价值的是其独特的业务功能,而现在的现状是我们花费了大量的时间在编写数据访问,CRUD方法,包括后期的Bug查找,维护等也会花费相当多的时间在数据处理上。这就是说,我们在实际的开发中很多的时间都被浪费在根本不创造价值的非业务事件上了。
  在使用ORM之后,我们将不需要再浪费太多的时间在ADO.NET和Sql语句上。ORM框架已经把数据库转变成了我们熟悉的对象,我们将只需要了解面向对象开发就可以实现数据库应用程序的开发。
  
  2) 简化代码,减少BUG数量。
  通过建立ORM系统,能够大量减少程序开发代码,实现ORM后,开发数据层就比较简单,大大减少了出错机会。
  
  3) 提高性能
  同时通过Cache的实现,能够对性能进行调优,实现了ORM区隔了实际数据存储和业务层之间的关系,能够对每一层进行单独跟踪,增加了性能优化的可能。
  
  4) 隔离数据源,可以很方便的转换数据库
  利用ORM可以将业务层与数据存储隔开,开发人员不需要关系实际存储的方式,如果我们需要把SQL Server数据库换成ORACLE数据库,只需要修改配置文件就可,不需要修改程序。
  4. ORM典型工具介绍
  由于ORM带来的强大便利,已经有很多公司或者个人提供ORM的工具。主要途径有三个:
  ① 微软提供的ObjectSpaces
  微软在VS.NET 2005的Alpha版中就提供了ObjectSpaces,它是在ADO.NET数据层上的一层ORM框架。但是,根据微软网站上提供的消息,ObjectSpaces将不会和VS.NET2005 一起发布,它可能会在2006(7)年和WinFS一起发布。所以可能无法在最近的项目中使用。
  
  ② 开放源码的免费ORM
  虽然.NET领域的开发源码还远远不及Java领域,但是已经有好多人把Java领域中的最优秀的开发源码转移到.NET平台上来。这其中包括做单元测试的NUnit,做日志的Log4NET,做AOP的Spring.NET,以及我们要介绍的做ORM框架的NHibernate。
  
  开发源码的更新都很频繁,如果你发现Bug报上去后,他们将会很快在新发布的版本中进行更新。
  开发源码的作用不仅在于使用,而且他们本身都是非常优秀的架构。在购买计算机图书的时候有一句话叫“No Coding, No Reading”,而开放源码中提供了如何构建架构、如何使用模式的最好范例。
  
  关于NHibernate现在文档还不是很多,但是相信随着它的正式版的发布,会有越来越多的官方文章出现,也会有越来越多的使用者在网上提供自己的经验。当然,最直接和有效的方法还是去阅读它的源码,因为开放源码的内部实现机制全部透明,所以它的代码就是最好的文档。它的代码结构很清晰,用法更简洁,并不是很难阅读。
  
  ③ 其他公司商业ORM产品
  也有一些公司使用是DevExpress的XPO作为ORM框架进行开发。

posted @ 2005-06-17 17:36  shipfi  阅读(523)  评论(0编辑  收藏