ORM的全称是Object Relational Mapping,即对象关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象(Object-Oriented)是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。当今企业级基于关系数据库开发的信息系统越来越多,而在你打开每个信息系统的数据访问层的时候,看到的几乎都是近似相同模式的重复性的代码。从软件复用技术的角度来看,这部分完全可以抽取出来加以复用,用以改善软件开发的生命周期,从而可有力保障在企业信息化建设中能及时的提供软件产品并具有更可靠的质量,且使得软件的开发和维护成本更低。这就是ORM的职责所在。也有人持不同意见,如ORM有性能损失。就让我们来分析下。
首先,让我们来做下比较,在同等条件同等数据量的情况,不使用ORM与使用ORM相比,显然不使用ORM执行时间会快那么一点点,但这点你很快就觉得没什么可值得骄傲的了:比如你在某次页面数据交互中,因使用ORM执行时间用了200ms,而没有使用ORM执行时间只须要190ms,提高了10ms啊!!!如果你做的是底层,提高的是CPU运算速度或者是I/O的速度,确实不赖。而这里是信息系统,这些在用户面前根本就感觉不到,即使你用了210ms、220ms用户也不关心这些,然而为了能够提高这些微不足道的x毫秒,你却要写大量重复的代码,不停的Ctrl+C/Ctrl+V,最后代码日积月累,你的代码行确实增加了,而且很快,日复一日,年复一年...恭喜,你终于成为一个代码量超过x万行的伟大的代码民工(不享受农民工待遇的“高级高素质”IT民工)!其实通过Cache的实现,能够实现对性能的调优。
其次,从项目周期和开发进度上来说,ORM无疑提供了最佳方案。对象映射可以使业务对象与数据库分离,使数据库层透明,开发人员真正的面向对象。ORM通过对开发人员隐藏SQL细节可以大大的提高生产力。没有哪个项目不计成本,无限制拖延下去的,多数是尽少投入尽快完成,还要易维护。使用ORM可以大大降低学习和开发成本。实际开发中,真正对客户有价值的是其独特的业务功能,而不应该把大量时间花费在写数据访问、增删改查(CRUD)方法、后期的Bug查找和维护上。在使用ORM后,ORM框架已经把数据库变成了我们所熟悉的实体对象,我们只需了解面向对象开发就可以实现数据库应用程序的开发,不需要浪费时间在SQL上。同时也可减少代码量,减少数据层出错机会。
再次,从职业生涯规划和人员能力提升方面,ORM因为节省大量的开发时间,无疑可以让开发人员有机会去做更有意义的事情,涉猎更多的知识。如果某人始终从事的都是这些模式重复的代码开发,顶多就是个熟练工。
最后,从根本上讲,当前信息系统开发基本上都是基于面向对象和关系数据库的,而面向对象是从软件工程基本原则(如耦合、聚合、封装、继承、多态),而关系数据库则是从数学理论(如关系模型、关系代数、关系运算、函数依赖)发展而来的,两套理论存在显著的区别。ORM就是为解决这个不匹配的现象而产生的。所以从某种意义讲,在ORM还未完全普遍存在的情况下,这种CRUD,也为想进入IT行业的一些青年提供了入门的机会;如果某天ORM像SQL语句或程序的顺序、分支、循环一样普遍,这样的IT从业者,何去何从还另当别论,然而国人大多数开发人员都是做CRUD的。
另外,Choice is only choice! 选不选择ORM是你自己的事,选择什么的ORM工具也是你来make a decision。不选择ORM你就不停的写CRUD呗,每人同情你;选择了ORM并且选择了合适的ORM工具你就享受它给你带来的益处吧。但如今很难定论那种工具才是最好的,各有优缺点。譬如面向对象与面向过程一样,OO提出这些年了也很成熟了,但今天面向过程的开发依然不少,且薪酬待遇比OO开发的强多了。如果非要给好工具做个判断,也许通用、兼容性、易学易用是个选择的依据。当然你选择所熟悉的,成员都能很好操作且能满足项目的需要,也许对你而言就是好的。一个技术再好若你不熟悉或不能满足你的特殊要求或你不用,对你也没有什么意义。当然这里不是说让你固步自封,不去接触新东西,恰恰相反而是要广泛涉猎,深入理解,不要老在一个地方兜圈子。LING TO SQL很不错,但是如果你用Oracle或Access、Sysbase、DB2...,却选择用LING TO SQL那就是你的事了;如果你想为每一种数据库都使用特定的ORM工具,这也是你自己的决定。选择一个工具重要的是你要能够很好的驾驽它,为你所用,而不是让你围着它转。
附注,EntitysCodeGenerate的设计是基于两个原则,ORM和“帕累托法则”(也作“80/20或90/10法则”),也就是说:花比较少(10%-20%)的力气就可以解决大部分(80%-90%)的问题,这样通过ORM框架,就仅需要付出少数时间和精力来解决剩下的少部分问题,这无疑缩短了整个项目的开发周期同时又保证了质量。对于特别复杂或海量数据处理等的特殊情况,也提供了相应方案,可用DbCore+SQL/存储过程来优化,实际中这部分在项目中所占比例很小,有些时候如赶工抢占先机,这部分也可以在项目后期优化。EntitysCodeGenerate可以和多种Web服务器或应用服务器良好集成,如今已经支持几乎所有流行的数据库。该工具最早一直是作者内部使用,并未公布,如今共享出来,欢迎交流,批评斧正!