`

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

阅读更多

 

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

 

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

 

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

 

 

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

 

 

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

 

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

 

 

 

 

 

 

 

 

 

   

7
10
分享到:
评论
51 楼 windshome 2013-06-06  
10年都不敢说精通的事情很多,因为世界在发展,技术也在发展变化,又不能像纯粹的技术研究人员那样去研究,只有在实际开发中去运用和理解。


我也同意你的要求对产品有更好的可控性这个说法,但是通常时候,很多技术都有从不认识,到逐步了解,到掌握,到可控这个过程。所以很多时候,即便不能完全掌控,不能非常精通,也还是可以在项目中使用的。

你说的JDBC,又有多少人能完全精通和掌控呢?我估计即便用JDBC2-3年的,也不大敢这么说。我也用JDBC时间很长了,感觉自己对这个东西也只有一知半解。自嘲一下,呵呵。

50 楼 rensanning 2013-06-06  
houxinyou 写道
rola 写道
各位,有考虑过维护吗?前几天,单位的一个使用了8年的Sybase库要迁移到Oracle,使用的是Hibernate,结果还是比较容易的?
说ORM不好的,大都是不怎么了解的,都是人云亦云。Hibernate现在我用了10年了,也不敢说完全精通,只不过依据个人的设计能力和项目复杂度,选用合适的技术和框架。
我想问的是,各位真的了解【面向对象】吗?如果真的吃透了,怎么会在ORM和JDBC上摇摆不定呢?

你用了十年都不敢说完全精通,一项技术用了十年都不能完全掌握,那么这个技术我真不敢用,还用JDBC好了,至少用过一段时间就能掌握.对于不可控的东西,学习可以,但是真的要用,还是算了吧

这位朋友过于偏激了。“掌握”“不可控”“精通”这几个词的含义是不一样的。“精通”这个词在国内目前处于被滥用的状态。“闻道有先后,术业有专攻”,不是所有中国人都能“精通”汉语吧!
49 楼 houxinyou 2013-06-06  
rola 写道
各位,有考虑过维护吗?前几天,单位的一个使用了8年的Sybase库要迁移到Oracle,使用的是Hibernate,结果还是比较容易的?
说ORM不好的,大都是不怎么了解的,都是人云亦云。Hibernate现在我用了10年了,也不敢说完全精通,只不过依据个人的设计能力和项目复杂度,选用合适的技术和框架。
我想问的是,各位真的了解【面向对象】吗?如果真的吃透了,怎么会在ORM和JDBC上摇摆不定呢?

你用了十年都不敢说完全精通,一项技术用了十年都不能完全掌握,那么这个技术我真不敢用,还用JDBC好了,至少用过一段时间就能掌握.对于不可控的东西,学习可以,但是真的要用,还是算了吧
48 楼 dwangel 2013-05-31  
windshome 写道

对 dwangel 回复一声:其实效率是考虑的一个重点。开发的效率固然也重要,但是在我的场景里,一个产品,从第一个版本V1.0开始设计和研发,往往2.X才能真正推向市场,面对客户,所以和产品质量、对设计和代码的掌控,比开发速度重要。


我说的就是这个意思啊。

看项目需求来的。
47 楼 windshome 2013-05-31  
其实我这篇文章的本意就是在做产品的时候,摒弃速食主义这种做法,也不要有为了节省点时间和代码量寻找免费午餐这种想法。在某些特殊项目不可避免,但是,对于一个需要长时间打造雕琢、长期改进更新的产品,最好是自己的技术选型,审慎考虑。

并不是说ORM怎么不好,只是被很多人用不好的方式使用,很多时候看得太重要。

以我的经验来讲,系统的复杂度,只能系统分析设计人员去面对,分析和解决,依靠通用性的框架和API是不大现实的。他们能解决的,是通用层面的问题。

想劝一下几位回帖的兄弟,讨论技术问题嘛,别生气也别上火。因为每个人都只能根据所知道的,所熟悉的,来得出临时的结论,用这样的结论来指导自己面对新的事物、新的领域,不断修正和完善自己的临时性结论。也许,技术生涯,都在这样不断的改进完善中度过。所以,我不怕自己浅薄,把自己的一些技术方面的想法说出来,一是能得到大家的指教,甚有幸焉;二则有助于自己心态变得成熟,不固守自己的技术知识和经验。


我常常笑自己是井底之蛙、夏虫不可语冰,所以尽可能使技术的讨论和辩论不演变成意气之争。别人说得对也好,不对也好,都欢迎提出对我的看法,哪怕是讥嘲也可以,但是讥嘲的话得让我明白,自己是哪里不足的,好改进过来。


对 dwangel 回复一声:其实效率是考虑的一个重点。开发的效率固然也重要,但是在我的场景里,一个产品,从第一个版本V1.0开始设计和研发,往往2.X才能真正推向市场,面对客户,所以和产品质量、对设计和代码的掌控,比开发速度重要。
46 楼 dwangel 2013-05-31  
windshome 写道
我做的系统不多,呵呵,也就几个吧,但是都是亿级数据量,365*7*24不间断运行的,承载关键业务的。而且,每个产品都会要求兼容Oracle、DB2、SQLServer、Sybase数据库,甚至还要对每一种数据库尽量发挥最大的效率和存取能力。

我的意思是不管怎么迁移,JDBC和ORM基本上所面临的工作都是一样的。

关注点不同。
你做的系统关注运行效率。

但是有些项目的注重的是开发效率,或者需求经常变更,业务需求变更的需求大于运行性能需求了,这时候,通过ORM,减少一些重复代码的编写就可以减少很多开发成本。

不过,在业务需求相对固定之后,hibernate可以改成直接访问存储过程模式了。
那时,就不能简单地改映射文件就能完成数据结构变更,要改相应的各种文件……
45 楼 damoqiongqiu 2013-05-31  
@archy123 这帖子不是我的,就不在这儿骂你了,免得影响人楼主。
44 楼 damoqiongqiu 2013-05-31  
archy123 写道
damoqiongqiu 写道
archy123 写道
damoqiongqiu 写道
回楼上,就不引用了。
【映射】这个东西一定是存在的,只要想存库,必然存在【映射】
从【映射】的角度看,自己写SQL插表叫映射;用所谓的ORM框架协助插表,也叫映射
原文重点不在于否定【映射】这个动作,重点在于是否需要所谓的ORM【框架】
我的观点和原作者基本一致
【只有小系统才有可能用所谓的“全自动ORM框架”,复杂业务系统,所谓“自动化的ORM”根本用不起来,或者使用的成本太高,比直接JDBC+一些辅助工具例如DBUtil要高太多(不举例,有兴趣可以直接找我私下交流)】

好像很多银行系统使用的就是hibernate,不知道银行系统业务算不算复杂

你说【好像】说明你不确定,也就是说你自己并没有涉及过银行业务。
对于自己没有涉及过的领域,不要意气风发、指点江山,那不是技术人员应有的行事风格。
我一直做电信领域,对银行相关的业务不作评论。

无知者无畏!

多学习,什么都不懂的时候不要出来乱说  
43 楼 archy123 2013-05-31  
damoqiongqiu 写道
archy123 写道
damoqiongqiu 写道
回楼上,就不引用了。
【映射】这个东西一定是存在的,只要想存库,必然存在【映射】
从【映射】的角度看,自己写SQL插表叫映射;用所谓的ORM框架协助插表,也叫映射
原文重点不在于否定【映射】这个动作,重点在于是否需要所谓的ORM【框架】
我的观点和原作者基本一致
【只有小系统才有可能用所谓的“全自动ORM框架”,复杂业务系统,所谓“自动化的ORM”根本用不起来,或者使用的成本太高,比直接JDBC+一些辅助工具例如DBUtil要高太多(不举例,有兴趣可以直接找我私下交流)】

好像很多银行系统使用的就是hibernate,不知道银行系统业务算不算复杂

你说【好像】说明你不确定,也就是说你自己并没有涉及过银行业务。
对于自己没有涉及过的领域,不要意气风发、指点江山,那不是技术人员应有的行事风格。
我一直做电信领域,对银行相关的业务不作评论。

无知者无畏!
42 楼 damoqiongqiu 2013-05-31  
archy123 写道
damoqiongqiu 写道
回楼上,就不引用了。
【映射】这个东西一定是存在的,只要想存库,必然存在【映射】
从【映射】的角度看,自己写SQL插表叫映射;用所谓的ORM框架协助插表,也叫映射
原文重点不在于否定【映射】这个动作,重点在于是否需要所谓的ORM【框架】
我的观点和原作者基本一致
【只有小系统才有可能用所谓的“全自动ORM框架”,复杂业务系统,所谓“自动化的ORM”根本用不起来,或者使用的成本太高,比直接JDBC+一些辅助工具例如DBUtil要高太多(不举例,有兴趣可以直接找我私下交流)】

好像很多银行系统使用的就是hibernate,不知道银行系统业务算不算复杂

你说【好像】说明你不确定,也就是说你自己并没有涉及过银行业务。
对于自己没有涉及过的领域,不要意气风发、指点江山,那不是技术人员应有的行事风格。
我一直做电信领域,对银行相关的业务不作评论。
41 楼 windshome 2013-05-30  
我做的系统不多,呵呵,也就几个吧,但是都是亿级数据量,365*7*24不间断运行的,承载关键业务的。而且,每个产品都会要求兼容Oracle、DB2、SQLServer、Sybase数据库,甚至还要对每一种数据库尽量发挥最大的效率和存取能力。

我的意思是不管怎么迁移,JDBC和ORM基本上所面临的工作都是一样的。
40 楼 Tyrion 2013-05-30  
snowolf 写道
看来做的系统不大,不曾遇到很多迁移系统。这方面半自动化的iBatis比Hibernate更灵活。orm主要是减少事务处理,代码开发量工作,并且保证质量。多做一些系统之后再来看这个问题,感觉博主接触的时间还太短。



呵呵,刚想说对于遗留系统的改造这个事,你说出来了。
39 楼 snowolf 2013-05-30  
看来做的系统不大,不曾遇到很多迁移系统。这方面半自动化的iBatis比Hibernate更灵活。orm主要是减少事务处理,代码开发量工作,并且保证质量。多做一些系统之后再来看这个问题,感觉博主接触的时间还太短。
38 楼 windshome 2013-05-30  
嗯,我的意见就是到Library就够了,不要再成为FrameWork了。
37 楼 rensanning 2013-05-30  
到底采用“全自动”的Hibernate,还是“半自动”的iBATIS/MyBatis,或者严格意义上不能成为ORM的Apache Commons DbUtils,主要在于想让他帮你做什么。Martin Fowler 在 Inversion Of Control 一文中有如下论述:
引用
Inversion of Control is a key part of what makes a framework different to a library. A library is essentially a set of functions that you can call, these days usually organized into classes. Each call does some work and returns control to the client.

A framework embodies some abstract design, with more behavior built in. In order to use it you need to insert your behavior into various places in the framework either by subclassing or by plugging in your own classes. The framework's code then calls your code at these points.


假设不采用ORM,从API入手封装自己的DAO处理,考虑到开发效率、可移植性、可维护性、可扩展性,你的代码也未必能逃过以下发展过程。
API → Toolkit → Libarary → Framework

问题不在于选择Toolkit还是Libarary或者Framework,而在于对象模型的建设。
36 楼 windshome 2013-05-30  
rola 写道
各位,有考虑过维护吗?前几天,单位的一个使用了8年的Sybase库要迁移到Oracle,使用的是Hibernate,结果还是比较容易的?
说ORM不好的,大都是不怎么了解的,都是人云亦云。Hibernate现在我用了10年了,也不敢说完全精通,只不过依据个人的设计能力和项目复杂度,选用合适的技术和框架。
我想问的是,各位真的了解【面向对象】吗?如果真的吃透了,怎么会在ORM和JDBC上摇摆不定呢?


设计的好的话,数据迁移和维护应该是不困难的啊。主要是需求和设计阶段搞得好才行,不是后期的实现的问题。

我曾经做过大概6-7千万数据从DB2迁至sybase,旧系统只支持DB2,新版本的系统支持DB2/Oracle/Sybase/SQLServer,需求和架构做得好,经过仔细的分析和测试,最后实施一切顺畅--当然,我使用的是JDBC。
35 楼 须等待 2013-05-30  
rola 写道
各位,有考虑过维护吗?前几天,单位的一个使用了8年的Sybase库要迁移到Oracle,使用的是Hibernate,结果还是比较容易的?
说ORM不好的,大都是不怎么了解的,都是人云亦云。Hibernate现在我用了10年了,也不敢说完全精通,只不过依据个人的设计能力和项目复杂度,选用合适的技术和框架。
我想问的是,各位真的了解【面向对象】吗?如果真的吃透了,怎么会在ORM和JDBC上摇摆不定呢?


这我就不敢苟同了,ORM是面向对象难道JDBC就不是面向对象?ORM还不是JDBC封装出来的?
真正的大师一样能用JDBC封装出良好的程序,一样能应付变更的需求。

还是那句话,每一种框架和技术都有其存在的道理,有其对应的业务场景,只有客观的了解了它的特点才能在特定的业务场景使用最正确的解决方案
34 楼 rola 2013-05-30  
各位,有考虑过维护吗?前几天,单位的一个使用了8年的Sybase库要迁移到Oracle,使用的是Hibernate,结果还是比较容易的?
说ORM不好的,大都是不怎么了解的,都是人云亦云。Hibernate现在我用了10年了,也不敢说完全精通,只不过依据个人的设计能力和项目复杂度,选用合适的技术和框架。
我想问的是,各位真的了解【面向对象】吗?如果真的吃透了,怎么会在ORM和JDBC上摇摆不定呢?
33 楼 Tyrion 2013-05-30  
以前看《领域驱动设计》这本书时,就一直想做项目能够像楼主这么搞,可以完全集中精力于业务层。但是这么几年下来,从来没达到过这样的状态。
32 楼 sundoctor 2013-05-29  
我也认同业务设计,可是现在公司都是倒过来的,上来就数据库设计,一个业务一张表,而且这还是需求人员设计数据库,公司高层认可这样的开发模式,晕死了

相关推荐

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

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

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

    java面试宝典

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

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

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

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

    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语法,使用非常方便,附加了使用说明文档。 例如,添加记录操作为...

    .net版ORM代码示例

    这篇内容主要以.NET ORM代码示例为切入点,讲解如何在.NET环境中使用ORM进行数据库交互。DLite可能是指一个特定的.NET ORM库,或者是自定义的一个轻量级ORM实现。在.NET中,有多个流行的ORM框架,如Entity Framework...

Global site tag (gtag.js) - Google Analytics