封封窝

还没有想好

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

DotNet中的数据持久层框架

孙洪亮
2005-12-07


下面是DotNet中的数据持久层框架(ORM,半ORM等)的列表:

    这么多的框架成熟的不多,各自的设计理念也不太一样。这些框架里我了解的不多。
    其中开源界比较流行的是NHibernate和IbatisNet。EasyObjects.NET 刚发布了1.0,基于Microsoft's Enterprise Library,利用了MyGenerater代码生成工具。下面先概要介绍NHibernate和Ibatis,然后重点讨论Ibatis.net。
    NHibernate是当前最流行的Java O/R mapping框架Hibernate的移植版本,当前版本是1.0,05年10月中旬发布,等效于Hibernate2.1的功能。NHibernate的流行得益于Hibernate在java社区中的流行和成功,现在和Hibernat一样归于JBoss组织,有希望改变原先NHibernate团队没有强有力的架构设计师和开发人员参差不齐的现状。
    IBatis.net也是java下项目Ibatis的.net(C#)版本移植,由于java和C#语言的差异,java版和.net版在配置上有细节的差别。IBatis原先是一个独立的开源项目,后被Apache Incubator(大约是在05年5月份),现在已经成为一级项目,可见Ibatis在Apache中的地位已举足轻重。Ibatis.net05年6月份发布了.NET DataMapper 1.2 and DataAccess 1.6,接口已经比较稳定,现在版本库处于重构和维护状态。Roadmap上介绍下一步的主要任务就是重构和增加对自定义类型处理器的支持,最主要的是要将DataAccess和DataMapper彻底分开(Distribute separate code releases for !DataMapper and !DataAccess frameworks ),会在下面介绍。
    NHibernate和IbatisNet各有优缺点,也各有适用的场合。
一.NHibernate
优点:
1.完全的ORM框架。
    NHibernate对数据库结构提供了较为完整的封装,它将数据库模式映射为较完全的对象模型,支持封装,继承机制,功能较强大,比一般的ORM灵活性高。
    开发人员可以完全按照对象模型操纵数据库。
2.代码自动生成,减少代码和sql的开发量,使开发人员摆脱开sql,ado.net和事务,缓存等底层。
    NHibernate的O/R Mapping实现了PO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员往往只需定义好了PO 到数据库表的映射关系,即可通过NHibernate提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握, NHibernate 会根据制定的存储逻辑,自动生成对应的SQL 并调用ADO.NET接口加以执行。
    NHibernate有工具可以直接根据数据库模式生成po类,或者通过在代码中添加Attribute属性自动生成配置文件。
    这些都减少了开发工作量。
3.较好的文档支持。
    NHibernate的代码可读性和文档都比较好。
 
缺点:
1.较复杂,学习曲线大。
2.对数据库模式有较高的要求。
    NHibernate需要数据库有良好的设计和比较完善的约束。
3.不适合统计查询系统。
    对于多表连查,复杂的sql实现比较复杂,而且有可能需要借助其他方案。
4.需要一些xml配置。
 
二.IBatisNet
IBatis不是一个ORM框架,而是一个半ORM,或者说Data Map。IbatisNet实际是一个PO与SQL之间的关系映射框架。也就是说,IbatisNet并不会为程序员在运行期自动生成SQL执行。具体的SQL需要程序员编写,然后通过映射配置文件,程序将SQL所需的参数传入,框架将映射好的结果返回。
优点:
1.简单易学。
    对于开发人员需要学习的东西比较少。
2.灵活。
    开发人员可以充分利用sql的强大功能。
3.对数据库的要求低。
    只要原先通过sql可以实现的功能,通过Ibatis几乎都能够实现。
4.除了数据映射DataMap,Ibatis还提供了DataAccess数据访问层框架,也就是DAO。
 
缺点:
1.半ORM,需要开发人员写sql,自动代码生成工具不完善。
2.需要一些xml配置。
3.还不是很成熟。
   
Is iBATIS the best choice for my project?
So, how do you decide whether to OR/M or to DataMap? As always, the best advice is to implement a representative part of your project using either approach, and then decide. But, in general, OR/M is a good thing when you
1. Have complete control over your database implementation
2. Do not have a Database Administrator or SQL guru on the team
3. Need to model the problem domain outside the database as an object graph.
Likewise, the best time to use a Data Mapper, like iBATIS, is when:
1. You do not have complete control over the database implementation, or want to continue to access a legacy database as it is being refactored.
2. You have database administrators or SQL gurus on the team.
3. The database is being used to model the problem domain, and the application's primary role is to help the client use the database model.
IbatisNet中的DataAccess框架提供了一个DAO框架,比较简单但很实用。
    DAO的好处主要是封装数据源,隐藏数据访问实现层为应用提供面向对象的数据操作接口。利用IbatisNet的DataAccess模块不但可以得到这些好处,而且最主要的,DataAccess通过xml配置文件,可以通过配置决定使用哪种数据访问实现。同一个应用中可以同时使用多个数据源,使用多种底层数据访问实现,比如DataAccess封装了NHibernate,SqlMap(也就是IbatisNet的sqlmap),和简单的ADO.NET实现。
    关于IbatisNet的详细功能和使用,以后介绍。
 
IbatisNet能够带给我们的:
    程序员可以不了解ADO.NET,可以不关心具体的数据提供者(使用Oracle还是MSSQL还是其他),可以不管理连接缓存。可以灵活的使用数据缓存。有利于我们建立一个合理的可扩展的系统架构。
 
为使用IbatisNet我们需要做的:
    学习IbatisNet。
    为利用IbatisNet写配置文件。
 
使用IbatisNet可能的风险:
    理论上说,由于IbatisNet是一个轻量级的非侵入的框架,使用它的风险会相对低。
Ibatis的优缺点及可行性分析
1.优点
简单:
 易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

实用:
 提供了数据映射功能,提供了对底层数据访问的封装(例如ado.net),提供了DAO框架,可以使我们更容易的开发和配置我们的DAL层。

灵活:
 通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。

强大:
 提供了连接管理,缓存支持,线程支持,(分布式)事物管理,通过配置作关系对象映射等数据访问层需要解决的问题。提供了DAO支持,并在DAO框架中封装了ADO.NET,NHibernate和DataMapper。

增强系统的可维护性: 
 通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

2.缺点
滞后性:
 还没有明确对.NET2.0的支持。
不成熟,工程实践较少: 
 IbatisNet在实际项目中的使用较少。
半ORM,工具支持较少: 
 需要我们自己写sql,并且.NET下还未发现可以自动生成业务层类和配置文件的工具,这点和NHibernate不一样,NHibernate会为我们的数据库直接产生sql,并有一些辅助工具。因此使用Ibatis比NHibernate要多做一些工作。

3.可行性
 没有最好的框架,只有最适合的框架。
 自己写sql由于不可能完全符合sql标准,比起NHibernate产生的sql,可移植性差。不过由于我们更改数据库的可能性较小,对我们来说这也并不是十分必要的。另一方面,NHibernate虽然可以屏蔽很多数据库间的不同,但是却很难利用某个数据库的高级特性。
   DotNet中数据访问层框架也不少,但绝大部分不成熟而且设计思路也各异。对它们的介绍可以参见我原先的DotNet中的数据持久层框架(2005-12-07)。
   我的看法是,NHibernate不适合数据库模式不规范,约束不完整,需要大量复杂查询的系统,自己写框架未必比Ibatis的好,稳定,强大和可扩展。而且自己开发框架也需要较大的工作量。如果使用DotNet并且要选一个数据层框架,Ibatis是一个比较不错的选择。他的那些缺点并不是致命的,而且也是有一些解决方案的。尤其是,当选用了Ibatis的DataAccess作为DAO框架时,我们可以同时使用NHibernate,ADO.NET和DataMapper(IbatisNet的核心组件),那样将会使风险降到最低,并且整个系统的框架比较合理。

posted on 2006-04-12 09:07  封封  阅读(2808)  评论(4编辑  收藏  举报