NHibernate Step by Step:序篇
很久以前,你可能习惯了connection.open,command.execute("select...")这样的代码,写啊写啊,你开始不停地copy/paste,因为数据库的操作太雷同了,还好,粘粘贴贴倒也凑合,然后有一天客户说他们要用oracle,于是你开始抱着本oracle开发指南狂啃pl/sql,你开始试验调用oracle的存储过程该怎么写,参数是用@还是?或者是:,取个blob游标又要咋写,你纳闷为啥这不同的数据库sql区别咋这么大呢?不都是号称符合啥sql几几的标准吗?你的头开始痛了,你开始写不同的DAL,代码与十指齐飞,脑袋昏昏天黑黑——又加班了!!这次第,怎一个愁字了得!!
然后你觉得再也不能这样过了,再也不能这样活了,你开始用DAAB,后来升级到Enterprise Library,恩,不错,代码好象少了,后来再加个Code Smith,恩,不错,自动生成代码,自己敲键盘少了,虽然你还得在不同的数据库间挣扎,还得把取出来的数据一点一点地填到你的实体类里,但是目前看上去还不赖,可以忙里偷闲泡杯两块八一包的劣质茶叶咂吧咂吧你那被劣质显示器辐射的开裂的嘴唇了。但是你觉得还不够,你在想,是否有Code Neo,或者干脆来个Code Matrix,整个DAL都不用自己写了,自动把数据库的数据填到自己的实体类里,然后对这个对象进行操作就行了,剩下的CRUD全部有这个Code Matrix来完成,达不达??
神啊,救救我吧……
“当当当当……“,O/R Mapping来到了大家的眼前。
O/R Mapping全称是object/rational mapping,即对象/关系数据库映射,意思是对象模型和关系模型的映射,也就是把我们常见的以对象模型表示的对象映射到关系模型上去,当然,这个关系模型我们常常指的是目前大部分主流的关系数据库,如oracle/sqlserver等等。基于.Net来说,o/r mapping就是将我们的.Net类映射到数据库中指定的表上,由O/R Mapping框架帮我们实现object<-->table之间的交互,我们完全不再需要写sql语句(当然不是绝对的),也不再关心背后用的是那种数据库,你只需要定义好对象和数据库该如何交互,剩下的,全部由O/R Mapping的框架来解决,你只需要如下代码即可:
Customer cust = framework.Get(...);
cust.Name = "newname";
framework.Save(cust);
或者:
framework.Delete(cust);
ok!!手起键盘落,整个世界清净了!!
是不是很动心啊??
ok,正式介绍今天的主角——Hibernate!!
Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框架,它对Java的JDBC(类似于ADO.Net)进行了非常轻量级的对象封装,使得程序员可以随心所欲的使用对象编程思维来操纵数据库,目前在国内Java开发界已经颇为流行,Hibernate+Spring往往是很多Java公司招聘的要求。而NHibernate,顾名思义,如同NUnit,NAnt一样,是基于.Net的Hibernate实现,但是目前介绍NHibernate的资料非常少,缺少一个系统完整的教程来全面的展现和深入NHibernate,而且现在NHibernate的文档又残缺不全,少的可怜,很多NHibernate的学习者往往都是通过Hibernate的文档来学习,但是毕竟不是所有的.Net开发者都熟悉Java,也不是所有的人都有精力有时间去学习Java,所以,我准备开始一个Step by Step的NHibernate教程,以便有兴趣的朋友能够快速的熟悉NHibernate,能够更快地体验NHibernate的开发乐趣。
我将会从零开始,配以详细的代码和图片,以便感兴趣的朋友能够最快最清晰地掌握NHibernate,任何建议,请e至:abluedog@163.com
posted on 2006-04-15 01:09 abluedog 阅读(6940) 评论(32) 编辑 收藏 所属分类: NHibernate
评论
不错,期待下文, 回复 引用 查看
#2楼 2006-04-15 04:34 TomTom
NHibernate 不错,但NHibernate 是不是放之四海通用.这个还要考虑考虑! 回复 引用 查看
#3楼 2006-04-15 08:27 dudu
支持并感谢作者写这样的教程! 回复 引用 查看
#4楼 [未注册] 2006-04-15 08:46 tsoukw
支持 回复 引用 查看
#5楼 2006-04-15 09:22 Michael.zh
世界上没有救世主,至少目前看来,NHibernate 如果依然为了通用和设计上的要求,而不顾性能上的问题的话,在很多关键应用领域让人望而却步。 回复 引用 查看
#6楼 [未注册] 2006-04-15 09:22 etg1979
强烈支持 回复 引用 查看
#7楼 [未注册] 2006-04-15 09:31 侵晨
期待楼主的后续。
是每天一篇么,还是不定期。不要有了开头没有结尾哦! 回复 引用 查看
#8楼 2006-04-15 09:50 徐灿钊Asp.net专栏
无比期待。 回复 引用 查看
#9楼 [未注册] 2006-04-15 10:29 wigruky'Blog
强烈期待中,感谢楼主,希望文章的速度快一点 ^ 回复 引用 查看
#10楼 [楼主] 2006-04-15 10:39 abluedog
@Michael.zh
理论上讲,o/r mapping由于进行了反射、生成sql及框架运行的维护等等,性能是要比直接的数据库操作稍微差一点,但是你要考虑团队开发中出现的蹩脚的sql语句,没有考虑优化的架构等等可以直接影响ado.net性能的问题,而使用o/r mapping工具,基础的操作都有框架来完成,一个设计优良的框架足以弥补以上不足,况且使用o/r mapping后而产生的生产力的大幅提高,更快的开发效率,足以让人心动。
o/r mapping框架的性能问题,你可以去搜索一下hibernate与jdbc性能比较的文章,基本上都可以满足一般的企业开发。
至于你所说的“关键领域”,我不知道你是不是指一些对性能或者实时性要求非常高的环境,这样的项目,一般都不大会使用java/.net这样的基于虚拟机的语言来开发,比如电信方面项目等等的核心部分,毕竟,都不能与c/c++来比较。
@侵晨
我会尽量保持每周2到3篇的速度。 回复 引用 查看
#11楼 2006-04-15 10:40 torome
up
希望能坚持!1 回复 引用 查看
#12楼 [未注册] 2006-04-15 11:10 剑在上海
期待下文,严重支持 回复 引用 查看
#13楼 2006-04-15 11:13 左洸
支持 回复 引用 查看
#14楼 2006-04-15 11:58 SOSOS's BLog
继续关注!!!!!!!很好!!!!!!!!!! 回复 引用 查看
#15楼 2006-04-15 11:59 老燕
一开始先别急着研究性能,应用领域的问题,先提出框架,然后再慢慢研究细节,这样的文章更有嚼头
支持楼主 回复 引用 查看
#16楼 2006-04-15 12:31 思考中{OO}
支持楼主,正打算开始学这个 回复 引用 查看
#17楼 2006-04-15 14:40 Michael.zh
我要声明一下,我非常赞成 abluedog 发出这一系列的学习文章,对大多数人来说,如何借鉴前人的经验学习一种新的技术,新的思想,或者说新的框架,都是非常有意义的,这里非常感谢 abluedog 的辛苦。
但我还是想说:世上没有救世主,也没有灵丹妙药,尤其在coding的工作中,对 NHibernate 抱着不切实际的期望的同学们,一切并不像大家想象的那么美好和令人心驰神遥,NHibernate 和大多数其他的技术一样,不管是过去的还是将来的,都有其闪亮的优点和不可回避的问题。
怀着一颗平常心,认真地学习其中值得借鉴的东西,并结合自身的实际工作加以应用,则是应有的态度。 回复 引用 查看
#18楼 [楼主] 2006-04-15 14:55 abluedog
@Michael.zh
“世上没有救世主,也没有灵丹妙药”
当然,也没有银弹。:)解决了持久层,还有业务层,表现层,都少不了写代码:) 回复 引用 查看
#19楼 2006-04-16 11:31 林子
@abluedog
性能问题是NH的最大问题所在!
上面说的“关键领域”,应该就是所有对性能方面要求较高的领域
当然在一般的项目或学习中用还是不错的选择!
回复 引用 查看
#20楼 [楼主] 2006-04-16 15:48 abluedog
以下关于性能的QA来自Hibernate官方网站:
Many people try to benchmark Hibernate. All public benchmarks we have seen so far had (and most still have) serious flaws.
The first category of benchmarks are trivial micro benchmarks. Hibernate of course will have an overhead in simple scenarios (loading 50.000 objects and doing nothing else is considered trivial) compared to JDBC. See this page for a critique of a trivial benchmark. If you'd like to avoid writing your own trivial and not very conclusive tests, have a look at the perftest target in Hibernate's build file. We use this target to check if a trivial performance bug slipped into the Hibernate code. You can use it to verify the JDBC overhead of Hibernate in trivial situations. But, as should be clear now, these numbers are meaningless for real application performance and scalability.
In a fair benchmark with complex data associations/joins, highly concurrent access, random updates of data in the application, real-world data set size, and utilizing other Hibernate features, you will find Hibernate perform very well. Why is there no such benchmark provided by the Hibernate developers? The first reason is trust. Why would you believe that the numbers shown by the vendor of a product, in a comparative benchmark, are true? The second reason is applicability. Certainly, a fair benchmark would show the benefits of Hibernate in a typical complete application with realistic concurrent access. However, the number of variables in any decent benchmark make it almost impossible to transfer these results into reasonable conclusions about the performance of your own application. Your application is different. (If you came here from a forum thread, think about it: instead of arguing with you about your trivial micro benchmark, we would be arguing why you don't see the same results in your application...) For these reasons we always recommend that you benchmark your application yourself. We encourage you to see performance and load testing as a natural stage in the life of your application - don't go into production with only micro benchmarks. Setting up benchmarks for your application and scenario, and helping you in this stage is in fact one of our usual support and consulting services.
Conclusion?
It turns out that Hibernate is very fast if used properly, in highly concurrent multi-user applications with significant data sets.
原文在http://www.hibernate.org/15.html 回复 引用 查看
#21楼 2006-04-17 02:46 卡卡.net
sp! 回复 引用 查看
#22楼 [未注册] 2006-04-25 10:12 westbulls
ORM最主要解决了分层开发中的持久层的问题,在N层开发中非常重要,期待楼主的下文,最好能够同时提供一些ORM工具间的对比,这样会看问题可能会更全面,学习中..... 回复 引用 查看
#23楼 [未注册] 2006-05-08 15:48 Androclus
太好了,很期待! 回复 引用 查看
#24楼 [未注册] 2006-08-02 20:43 XPang
I really appreciate that!! Keep going ,man 回复 引用 查看
#25楼 2007-03-26 12:42 双飞燕
期待ing 回复 引用 查看
#26楼 [未注册] 2007-05-23 21:35 xywhnh
好东西,今天刚接触到NHibernate这个东西,真正感觉到N层架构的优势! 回复 引用 查看
#27楼 [未注册] 2007-06-02 00:26 条码,条形码,条码打印机,条码扫瞄枪,标签,碳带,条码解决方案
好东西,今天刚接触到NHibernate这个东西,真正感觉到N层架构的优势 回复 引用 查看
#28楼 [未注册] 2007-07-01 20:02 平凡的人
首先感谢楼主对大家的帮助,我现在也在学习.net下MVC模式以及数据持久化的应用,不知道大家有什么好的建议? 回复 引用 查看
#29楼 [未注册] 2007-07-17 10:37 fangyc2007
看了看abluedog写的关于NHibernate的教程,我是刚刚接触NHibernate,对里边的东西是似懂非懂,看得懂是怎么会事,但是不知道怎么操作,但是非常感谢,让我一个初学者学到了可以学的东西 回复 引用 查看
#30楼 [未注册] 2007-08-29 16:00 aaa
好文章,期待中... 回复 引用 查看
#31楼 [未注册] 2007-09-03 09:10 yang aiyou
好文章,很好的文才,幽默感特强。支持,谢谢! 回复 引用 查看
#32楼 [未注册] 2007-09-17 14:16 tonglanli
好文章 真是牛啊 读起来这么顺 回复 引用 查看