`

ORM已经死了吗?我不喜欢ORM这东西

阅读更多

 

       做开发这一行这么多年,Java开发也十多年了,我一直不大喜欢ORM这个东西,我觉得这个东西实际上是对思路的一种误导,这也和常见ORM的做法有关。

 

      我做系统设计时,一般都是先不设计数据库,或是把数据库设计尽可能后延,先把系统业务逻辑中,各种对象的业务关系,使用UML、流程图或伪码、代码的方式来描述,来评审,而其中数据存取部分都是伪实现和伪设计,在设计期间,只要描述说,可以将业务对象保存起来,可以将某个业务对象取出来就可以。这样,完全抛开了数据库对业务设计的干扰。

 

    在我系统设计的观念里,没有所谓“实体对象”和“控制对象”这个词,只有“业务对象”,后期实现业务对象的持久化,我基本上都完全推到实现和编码阶段。我的看法,在早期的设计阶段,必须完全以业务对象和业务逻辑为主,不应该分心去想别的。所谓“实体对象”和“控制对象”对业务是无意义的。

 

 

在JDon上看到一个经典的说法:

 

 

事实上,在数据的访问上,我们需要的,仅仅是一个小小的库, 帮助我们完成连接的管理和结果集数据的自动提取而已。

 

当然,更为严重的是那句“ORM已死”,呵呵,我倒没有想ORM是否死了,我只是简单的认为,ORM根本就是系统中的一个小工具层,不应当称为“框架”。我们更不能让这些东西干扰我们的设计。设计以体现业务的过程为主

 

 

 

 

 

 

 

 

 

   

7
10
分享到:
评论
31 楼 diggywang 2013-05-29  
超级复杂的,是很难用上ORM!
超级简单的,不稀罕用ORM!
只有不大不小的,拿ORM当工具,可以节省些时间。
现有系统很多个关键业务,存储过程在Oracle Exadata上一跑就是好几个小时,sql代码都在2万行以上,这种场景用ORM,估计要吐血...
30 楼 windshome 2013-05-29  
islove1945 写道
用不用orm如何影响业务逻辑层的设计,真想不出为什么。觉得应该是数据库表的逻辑设计影响到后台业务逻辑的设计吧,你在dao里用什么方法持久化数据应该不会对业务逻辑造成影响,在getXXX,saveXXX些方法里可以自由选择认为合适的方法去access数据库。
orm的oo操作数据库方式,hiberante的缓存机制,对osgi和jbpm的支持都是选择他得原因,至于缺点呢也不少,要具体去权衡用不用了。


我是指目前对ORM的不当使用来讲的,当然你用的好,不会有什么坏的影响,还能给开发带来好处,那是自然的事情。从表结构产生代码,从类产生数据库结构,这两种典型的不好的实践。都有一个特点:省时间。为了省时间,就是速食主义的做法,是做产品的忌讳,也是我最反对的(项目不在讨论之列)。

还是请看我后一篇解释 http://windshome.iteye.com/blog/1879212
29 楼 islove1945 2013-05-29  
用不用orm如何影响业务逻辑层的设计,真想不出为什么。觉得应该是数据库表的逻辑设计影响到后台业务逻辑的设计吧,你在dao里用什么方法持久化数据应该不会对业务逻辑造成影响,在getXXX,saveXXX些方法里可以自由选择认为合适的方法去access数据库。
orm的oo操作数据库方式,hiberante的缓存机制,对osgi和jbpm的支持都是选择他得原因,至于缺点呢也不少,要具体去权衡用不用了。
28 楼 white_crucifix 2013-05-29  
楼主你可以点击别人用户名右边那个“引用”超链及,在回帖框里会自动生成引用格式的~ 哈哈
27 楼 windshome 2013-05-29  
回复 guilipan ,我还是有一次从JDon上看到对象和关系数据库“阻抗”这一说法,觉得很新奇。我从来不认为这两者之间有什么阻抗。

当然,两者不是一个时代的概念,自然,区别很大。但是也完全可以通过“数据”这一中间层在产品项目中合作无间。无非是对象->数据->数据库。这是很简单的思路,实现起来也不复杂。


当然,要是非不想用中间的“数据”,就一门心思把对象直接塞到数据库中,那自然有各种设计上的问题了。
26 楼 windshome 2013-05-29  
须等待 写道
windshome 写道
银行业务分很多种,例如核心、网上银行、企业应用等等,性质不同,采用的技术也不同。


童鞋你对银行业务很熟悉啊,我想跳去银行,有什么comments吗?

前些年和银行客户打交道很多,顺道了解了不少信息而已。目前的工作和银行关系不大。

有个建议,就是如果要跳到银行,一定去小行,不要去大行。小行例如浦发、民生都非常好;大行,例如工行、农行待遇一般,而且辛苦。
25 楼 须等待 2013-05-29  
windshome 写道
银行业务分很多种,例如核心、网上银行、企业应用等等,性质不同,采用的技术也不同。


童鞋你对银行业务很熟悉啊,我想跳去银行,有什么comments吗?
24 楼 guilipan 2013-05-29  
ORM的出现是解决数据库模型和后台语言中的模型(类)的阻抗失调,这也是为什么现在有领域驱动开发出现,很多工具的出现都只是在众多限制条件下的trade-off
23 楼 windshome 2013-05-29  
银行业务分很多种,例如核心、网上银行、企业应用等等,性质不同,采用的技术也不同。
22 楼 archy123 2013-05-29  
damoqiongqiu 写道
回楼上,就不引用了。
【映射】这个东西一定是存在的,只要想存库,必然存在【映射】
从【映射】的角度看,自己写SQL插表叫映射;用所谓的ORM框架协助插表,也叫映射
原文重点不在于否定【映射】这个动作,重点在于是否需要所谓的ORM【框架】
我的观点和原作者基本一致
【只有小系统才有可能用所谓的“全自动ORM框架”,复杂业务系统,所谓“自动化的ORM”根本用不起来,或者使用的成本太高,比直接JDBC+一些辅助工具例如DBUtil要高太多(不举例,有兴趣可以直接找我私下交流)】

好像很多银行系统使用的就是hibernate,不知道银行系统业务算不算复杂
21 楼 windshome 2013-05-29  
其实我想表达的是:从设计上说,只有业务对象。和业务对象的行为、业务对象之间的关联。

20 楼 white_crucifix 2013-05-29  
其实不太清楚楼主的“业务对象”和“实体对象”区别。因为从原则上来说,orm框架,比如hibernate,只会对系统设计的进行延伸,应该不会干扰系统设计。比如楼主说的设计时只到存储层之上的,那么在编码期,orm做的就是将你设计的最终的对象给映射到database里。
当然这是理论上的,因为现实的系统往往需求复杂多变,就是上层产生的一个对象不是简单的就映射到db里的一张或两张表。这里就涉及到orm框架一个讨论更为广泛的话题,就是需求复杂的时候,用orm框架合算吗,有时候直接写sql甚至效率更好,包括编程效率和执行性能。
19 楼 windshome 2013-05-29  
兼听则明,我肯定不会固守自己的意见,不管什么样的意见,只要都是对于技术的讨论和思考,都欢迎大家提出,都表示欢迎,哪怕观点和我南辕北辙。
18 楼 damoqiongqiu 2013-05-29  
楼主没必要理睬无聊的人,那种人无法静下心来倾听别人意见,没什么前途的
17 楼 windshome 2013-05-29  
nfoliver ,我可没有那个意思,我只是说我不喜欢而已。并不强加这个观点给别人。而且本身把这个写在文章里,也是想和大家沟通,希望得到高手的指点和指正。根据项目本身特点决定技术选型那是必然的。
16 楼 nfoliver 2013-05-29  
你不喜欢就得死?你能决定的了?我觉得还是要根据项目本身去决定!
15 楼 alvin198761 2013-05-29  
只怪你们做的东西都跟数据库有关,不做这方面的,啥事没有,
14 楼 damoqiongqiu 2013-05-29  
回楼上,就不引用了。
【映射】这个东西一定是存在的,只要想存库,必然存在【映射】
从【映射】的角度看,自己写SQL插表叫映射;用所谓的ORM框架协助插表,也叫映射
原文重点不在于否定【映射】这个动作,重点在于是否需要所谓的ORM【框架】
我的观点和原作者基本一致
【只有小系统才有可能用所谓的“全自动ORM框架”,复杂业务系统,所谓“自动化的ORM”根本用不起来,或者使用的成本太高,比直接JDBC+一些辅助工具例如DBUtil要高太多(不举例,有兴趣可以直接找我私下交流)】
13 楼 jinnianshilongnian 2013-05-29  
LeoChowComtop 写道
damoqiongqiu 写道
实体关系映射本来就是个伪概念
在业务非常复杂的系统里面,程序里面的【实体】,或者说业务对象,本身结构非常复杂,而且实体之间的关系很复杂,而且多变。很少能简单配置配置就映射成关系型数据里面的记录。
能很简单地进行映射的表很少,比如静态表、域表之类的


你说的我挺认同,ORM当工具使嘛,这玩意不万能,所以ibatis才有生存空间咩,还有的全存储过程开发的。

其实只要对象-关系之间无法直接转换,就会有映射器;
如hibernate是全自动的映射器(SQL、设值都是自动的)
如ibatis是半自动的映射器(SQL要手工、设值按照规则自动的)
如spring jdbc也是自动/半自动的(SQL要手工、设值可自动/手动)
还有如jdbc完成手动;
就看怎么选的问题了;都有存在的意义。
12 楼 LeoChowComtop 2013-05-29  
damoqiongqiu 写道
实体关系映射本来就是个伪概念
在业务非常复杂的系统里面,程序里面的【实体】,或者说业务对象,本身结构非常复杂,而且实体之间的关系很复杂,而且多变。很少能简单配置配置就映射成关系型数据里面的记录。
能很简单地进行映射的表很少,比如静态表、域表之类的


你说的我挺认同,ORM当工具使嘛,这玩意不万能,所以ibatis才有生存空间咩,还有的全存储过程开发的。

相关推荐

    Java面试题55.ORM是什么?ORM框架是什么?.mp4

    Java面试题55.ORM是什么?ORM框架是什么?.mp4

    55.ORM是什么?ORM框架是什么?.avi

    java面试宝典

    ORM框架ORM框架ORM框架ORM框架

    ORM(Object-Relational Mapping,对象关系映射)框架是一种软件技术,用于将关系数据库的数据映射到对象上,使得开发者可以使用面向对象的方式来处理数据库操作,而无需直接编写SQL语句。ORM框架的主要目标是简化...

    hsweb-easy-orm, 简单的orm工具,为动态表单而生.zip

    HSWeb-Easy-ORM 是一个开源的简单对象关系映射(ORM)工具,设计初衷是为了简化动态表单的处理。ORM 工具的核心作用在于桥接数据库与编程语言,允许开发者通过面向对象的方式操作数据库,避免了直接编写 SQL 语句的...

    cpp-SQLiteORM用于现代C的SQLiteORM库只有header

    标题中的"cpp-SQLiteORM用于现代C++的SQLite ORM库只有header"表明这是一个关于C++的SQLite对象关系映射(ORM)库,且该库仅包含头文件,这意味着开发者无需链接任何库文件,只需包含相应的头文件即可使用。ORM是一...

    ORM思想的深入学习ORM.zip

    ORM,全称Object-Relational Mapping,即对象关系映射,是一种编程技术,用于将关系数据库的数据模型映射到面向对象的软件应用中。在Java领域,Hibernate和MyBatis是两种广泛应用的ORM框架,它们极大地简化了数据库...

    K-ORM 自定义ORM工具

    对于初次使用K-ORM的开发者来说,这份文档是必不可少的参考资料。 总的来说,K-ORM作为一款自定义的ORM工具,利用JDBC提供数据库连接和SQL执行的能力,结合Java反射机制实现对象与数据库之间的映射。它简化了数据库...

    sqlite3的ORM框架

    SQLite3的ORM(Object-Relational Mapping)框架是一种在C++编程中将数据库关系模型与对象模型进行对应的技术。ORM框架使得开发者可以使用面向对象的方式来操作数据库,避免了直接编写SQL语句,提高了开发效率和代码...

    ORM对象关系映射

    对象关系映射(ORM) 对象关系映射(ORM)是一种概念性的、易于理解的模型化数据的方法,基于三个核心原则:简单、传达性、精确性。ORM 方法论提供了概念性的模型化数据的方法,基于数据模型创建正确标准化了的结构...

    Moon.Orm下载

    Moon.Orm是一个专门为.NET开发者设计的轻量级ORM(对象关系映射)框架,它具有强大的功能和良好的可扩展性,能够支持多种不同的数据库系统,包括但不限于MySQL、SQL Server、Oracle、SQLite等。ORM框架的主要目标是...

    ORM

    ORM(Object-Relational Mapping,对象关系映射)是软件开发中的一个重要概念,它提供了一种在关系数据库和面向对象编程之间架起桥梁的方法。通过ORM技术,开发者可以使用面向对象的方式来操作数据库,而无需直接编写...

    orm的详细解释概念

    对象关系映射(ORM,Object-Relational Mapping)是一种编程技术,它旨在解决面向对象编程语言与关系数据库管理系统之间的不匹配问题。ORM 提供了一种方式,使得开发者可以用面向对象的方式来处理数据库,而无需直接...

    ORM映射与WEB的应用

    在《采用ORM技术的软件开发方法研究》这篇文档中,可能详细探讨了如何在实际项目中引入和利用ORM技术,包括如何配置ORM框架、设计合理的映射关系、优化ORM的性能等方面。通过阅读这篇文档,开发者可以深入理解ORM在...

    ORM Framework

    ORM(Object-Relational Mapping,对象关系映射)框架是一种技术,它允许程序员使用面向对象的方式来操作数据库,而无需关心底层的SQL语句。在Java、C#等编程语言中,ORM框架广泛应用,极大地简化了数据库操作,提高...

    eform集成开发手册

    eform集成开发手册是开发者不可或缺的指南,涵盖了eform集成开发的各个方面,包括系统文件说明、系统表结构说明、eform for .net 和eform for java 的使用等。通过阅读本手册,开发者可以快速了解eform的集成开发...

    php中的orm

    在这些ORM框架中,"源码"标签可能意味着博客会深入到ORM的内部实现,探讨如何阅读和理解ORM的代码,这对于想要自定义或优化ORM行为的开发者非常有用。而"工具"标签可能涵盖了如何集成和使用这些ORM工具到项目中的...

    eform自定义表单

    **安装说明**:`eform安装说明.txt`文件提供了详细的安装指南,这对于首次使用eform的开发者来说是必不可少的。它通常会涵盖系统需求、环境配置、安装步骤以及可能出现的问题和解决方法。遵循这些说明,开发者可以...

    我的 ORM 框架

    使用运算符重载,实现 ORM 框架里的 INSERT、UPDATE、DELETE 和 SELECT 语句动态生成。SELECT 语句支持 INNER JOIN、LEFT OUTER JOIN 和RIGHT OUTER JOIN 多表联合查询,但不支持同一表的联合查询。 代码中只实现了 ...

    手写orm

    【标题】:“手写ORM”指的是自己动手实现Object-Relational Mapping(对象关系映射)技术,这是一种在软件开发中将数据库操作与业务逻辑解耦的方法。ORM允许开发者使用面向对象的方式来操作数据库,无需关心底层SQL...

    SqliteORM,一个很好的Sqlite ORM框架

    Sqlite ORM 是一个简单的C#类,对Sqlite的操作进行了封装,主要功能包括:表定义、生成,访问,更新等,其中,支持,多表的连接操作,语法类似Linq语法,使用非常方便,附加了使用说明文档。 例如,添加记录操作为...

Global site tag (gtag.js) - Google Analytics