`
xseven
  • 浏览: 15752 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

java持久层框架分析

阅读更多
一.  目前在java应用程序开发中,使用广泛的,开源的持久层框架是Hibernate 和 Ibatis 。


ibatis和hibernate都是ORM解决方案,不同的是两者各有侧重。Hibernate提供了Java对象到数据库表之间的直接映射,开发者无需直接涉及数据库操作的实现细节,实现了一站式的ORM解决方案。而ibatis则采取了另一种方式,即提供Java对象到SQL(面向参数和结果集)的映射实现,实际的数据库操作需要通过手动编写SQL实现。iBatis是又一个O/R Mapping解决方案,和Hibernate相比,iBatis最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis是能满足你的要求又足够灵活的最简单的解决方案。

持久框架的灵活性有两层意思,一种是简单易扩展,另一种是功能强大提供了很多选项。Ibatis属于前者,而Hibernate属于后者。


Hibernate

简介:

它是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

Hibernate的目标是成为Java中管理持续性数据问题的一种完整的解决方案。它协调应用与关系数据库的交互,让开发者解放出来专注于手中的业务问题。

Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。

Hibernate是一种非强迫性的解决方案。开发者在写业务逻辑与持续性类时,不会被要求遵循许多Hibernate特定的规则和设计模式。这样,Hibernate就可以与大多数新的和现有的应用平稳地集成,而不需要对应用的其余部分作破坏性的改动。

优点:
1.Hibernate功能强大,数据库无关性好,O/R映射能力强,如果精通Hibernate,而且对Hibernate进行了适当的封装,那么项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快。

2.hibernate体现了OO编程的思想,许多OO的特性都可以用上,比如:继承,多态。而且有利于代码的重用。比如你有一个DAO,其中有一个save(Object)方法,那么,对于任何需要保存的对象,把它当作参数传给这个方法就可以了。 

3.方便系统的移植,对于不同的数据库系统,对于已经编写好的系统,一般情况下,只需要修改hibernate配置文件的dialect,那么它就会生成对应的数据库的sql语句。  

4.有着正确的数据模型。以POJO为基础的模型是个正确的方向; 可配置性(例如对象之间的关系)是个很好的基础;HSQL正是O/R映射语言应该有的; 有着完整的API; 采用简明的Session类作为控制流的清洗器,因为它沿用了Connection的模型

5.开源和免费的License,可以在需要的時候研究源代码,改写源代码,进行功能的定制。具有可扩展性,API开放,当本身功能不够用的时候,可以自己编码进行扩展

6.hibernate已经成为了事实上的标准,目前使用的人多,所以技术支持也多,有什么问题也很容易在网络上寻求解决方案。


缺点:

1.学习门槛不低,要精通门槛更高,在设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要丰富的经验。

2.Hibernate不适合数据库模式不规范,约束不完整,需要大量复杂查询的系统。

个人意见: 推荐使用


IBatis:

简介:

相对于Hibernate和Apache OJB等“一站式”ORM解决方案而言,IBatis是一种“半自动化”的ORM实现。

这个框架将让你能够更好的在JAVA应用中设计和实现实体层。这个框架有两个主要的组成部分,一个是SQL Maps,另一个是Data Access Objects。另外还包括一些可能很有用的工具。

使用ibatis提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象, 这一层与通过Hibernate实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL语句,而ibatis则要求开发者编写具体的SQL语句。相对Hibernate等“全自动”ORM机制而言,ibatis以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。作为“全自动”ORM 实现的一种有益补充,ibatis的出现显 得别具意义。

优点:
1.易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
(简单: 我们都喜欢简单,简单意味着学习成本低,使用中出错的可能性低。同时,简单的东西一般来说功能不够强大。反过来,复杂的东西学习成本高,用起来不方便,并且团队没有很强的技术实力,一般不要使用。)

2.最大的优点是可以有效的控制sql发送的数目,提高数据层的执行效率!它需要程序员自己去写sql语句,不想hibernate那样是完全面向对象的,自动化的,ibatis是半自动化的,通过表和对象的映射以及手工书写的sql语句,能够实现比hibernate等更高的查询效率。

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

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

5.功能完整:提供了连接管理,缓存支持,线程支持,(分布式)事物管理,通过配置作关系对象映射等数据访问层需要解决的问题。提供了DAO支持,增强系统的可维护性:

6.SQL集中管理,因为我们不能保证程序员写的复杂SQL没问题。

缺点:
1.iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

2.它是一个半ORM,工具支持较少:需要手写sql,并且未发现可以自动生成业务层类和配置文件的工具,这注定了Ibatis不能从本质上提升开发效率,我们需要自己写sql,写实体类,写配置文件。但这也是它优越的地方,它没有为我们做的他多,所以我们就有更多的施展空间。而且它非常适合那些并不能完全控制数据库的系统和需要利用数据库本身提供的高级特性的统计查询系统的开发。

个人意见: 强烈推荐


二. 持久层的框架中非开源项目则以EJB为主要代表:

EJB的entiy Bean :

简介: 
提供健壮的数据持久性。bean容器处理大部分的数据完整性、资源管理和并发性功能,从而使开发人员关注业务逻辑和数据处理,而不是这些低级细节。使用bean管理的持久性(Bean ManagedPersistence,BMP)实体bean时,开发人员编写持久性代码而容器确定何时执行该代码。使用容器管理的持久性(Container Managed Persistence,CMP)实体bean时,容器生成持久性代码并管理持久性逻辑。 


优点: 

1.标准化:EJB规范定义一组与供应商无关的接口,J2EE供应商可以实现这些接口来支持实体bean。这种标准化允许采用最佳实践的开发并缩短雇用新开发人员时的适应期。

2.容器管理的服务:EJB容器管理的服务为处理诸如安全性、事务处理、连接合用和资源管理之类的企业功能提供了极大的好处。
 
3.透明持久性:CMP时容器能自动管理持久性语义。虽然使用BMP实体bean时,开发人员必须编写持久性逻辑,而容器则确定何时调用由开发人员定义的方法。同时使用CMP和BMP实体bean时,容器决定何时持续保持bean的状态以及如何确保与底层数据存储的数据完整性和并发性。 

4.事务支持:开发人员对CMP事务(隔离级别、事务需求和方法的包含/排除)有粗粒度的控制权,对BMP事务有细粒度的控制权,这些控制都是通过在bean代码中以程序方式处理事务语义实现的。在这两种情况下,容器管理事务并确定是否应该提交给定的事务。 

5.基于组件的设计:实体bean被设计成自包含组件,这些组件配置有部署描述符,无需更改任何代码就可以将它们部署到任何J2EE应用程序服务器。

总体来说,entiy bean的优点是可以从标准化和业界最佳实践中受益,简化了企业开发的某些复杂性.

缺点:
 
1.设计复杂。 
 
2.由于企业bean和(尤其是)实体bean的复杂性,所以一次迭代(设计/构建/测试/集成/测试/部署)所花的时间比其他Java持久性解决方案所花的时间可能长很多。 
 
3.响应时间不理想 
 
4.资源占用过高,总是会消耗掉大量的服务器资源。

个人意见:不推荐



JDO:

简介:

JDO是Java对象持久化的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC   API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。

优点:

1.设计简单。 

2.细粒度控制,允许开发人员对整个持久性进程进行完全控制,包括高速缓存、持久性、并发性和同步等。   

3.编码简单。JDO   体系结构向开发人员隐藏了低级别的持久性细节。 
 
4.JDO并不仅仅使Java对象持久;它还透明地处理整个相关对象图的持久性。因此,当实例被持久存储时,它所维护的对其它对象实例的任何内部引用也都被持久存储(除非它们已被声明为瞬态)。JDO还存储类型层次结构的完整信息,并能根据类型(父类和接口)实现请求,而不是只了解持久实例的特定局部类型。   
   

缺点:

1. JDO没有一个好的开源免费实现,好的产品都是商业产品,并且在国内没有销售和技术支持。这就造成了JDO只有学习之用,不能把它用在实际项目中,否则的话,你把软件卖给客户的时候,还要告诉他,你还要另外去买一个国外的软件产品,并且在国内没有技术支持,出了持久层的问题,我们也解决不了,请你自己打国际长途去解决问题,你认为客户能答应吗?

2.JDO不是一个轻量级封装,它试图建立一个完整的持久层框架,但是还很不完善,造成了JDO 感觉比较笨重,很多操作方式令人觉得烦琐和古怪。这加重了程序员学习和编程的负担,而且封装的太多会造成一个严重的问题就是一旦出现报错信息,调试起来非常困难,你很难准确的定位错误究竟出在哪里,封装的越轻,问题越容易定位,越容易解决,封装的越重,问题越复杂,越找不到原因,CMP就是一个很好的例子,出了错误,调试起来非常困难和麻烦。

3.JDO的标准很不完善,存在重大缺陷。最主要的问题体现在PO不能脱离PM(相当于 Hibernate的Session)而存在,这是个非常严重的问题,会造成编程的时候进行大量VO的拷贝操作,烦琐极了;另外一个重大缺陷是静态的 POJO的Enhancer,不能运行期动态Enhance,无法进行增量编译和调试,编程和调试起来非常烦琐,每次都要手共运行一个工具对POJO进行 Enhance;此外还有一些缺陷,例如JDOQL不完善,映射关系的表达不够强大等等。

4.JDO产品的分裂。这个问题也比较严重,由于JDO1.0标准的缺陷,而各个JDO厂商为了能够在竞争中脱颖而出,那么除了在易操作性和性能上的提高之外,想要吸引客户,就必须有自己的产品特色。那么1.0标准的缺陷正好给了他们发挥的舞台,每个厂商都会有自己独到的解决方案来解决标准的缺陷,然而这却造成了JDO 产品事实上的分裂。这种分裂严重到什么程度?我可以简单举个例子:你写好的POJO,用一种JDO的Enhancer进行Enhance过以后得到的 PO,在另一个JDO产品上跑不起来。这很像当年Unix的分裂,结果就是二进制代码级的不兼容,而只能在C源代码级兼容。现在的JDO也有这样的趋势,就像App Server的差别一样,一个在Weblogic上开发好的EJB,移植到Websphere,你一定需要重新进行配置。

个人意见:不推荐

三. 自行开发持久层框架评估:

优点:

1.对框架的熟悉程度比使用已有产品相对较好,能够深度了解底层机制,能够最大限度的使用框架的功能, 使用起来灵活自如, 功能扩展也比较方便。

2.提高开发人员的持久层设计经验。

可能存在的问题:

1.如果缺乏对JDBC的了解和数据持久层开发的经验,可能自己开发的数据持久层会慢慢的不满足业务需求,也就是功能可能不够强大,比如在数据缓存、连接池管理、多数据库支持等等方面

2.如果对设计模式,持久层设计思想没有足够的了解和经验,框架可能缺乏可扩展性,结构不够灵活。

3.可能会耗费较多的人力和时间。

个人意见:

不管JDO也好,Hibernate也好,ibatis也好,软件的使用和配置方法可以各异,但本质上都是ORM,都是对JDBC的对象持久层封装,所以万变不离其宗,我觉得只有在用过目前已有的一些开源持久层框架,深入理解它们的持久层设计思想,有了一定的技术积累后,才能设计出适合于我们的项目的持久层。



分享到:
评论
4 楼 chancelai 2010-04-28  
看来IBatis与Hibernate是互补关系了
还有看来EJB太强大了
3 楼 abettor 2009-09-03  
不知楼主有没有用过各种持久曾框架与amoeba整合,在这方面有什么经验可以跟小鸟们分享下。
2 楼 xiaohuanbaby 2009-07-04  
看来楼主是高手,分析的很清晰
1 楼 yumman 2008-11-30  
分析的很细,学习ing,顶。。。

相关推荐

    java持久层框架对比

    ### Java持久层框架对比 #### 概述 Java持久层框架是用于实现对象与数据库之间的交互,以便在软件开发过程中简化数据库操作的重要工具。本文旨在对比四种常用的Java持久层框架:Hibernate、iBatis(现称MyBatis)...

    基于Java的持久层框架,零配置,零SQL操作持久层.zip

    Java持久层框架是Java开发中用于数据库操作的关键技术,它为开发者提供了抽象化的数据库访问机制,使得开发者可以避免直接编写繁琐的SQL语句,提高开发效率。本资料包"基于Java的持久层框架,零配置,零SQL操作持久...

    自己手写的Java持久层框架DdwDao

    标题“自己手写的Java持久层框架DdwDao”与描述“自己手写的Java持久层框架DdwDao”均指代同一主题,即介绍一款由个人开发的Java持久层框架,名为DdwDao。DdwDao框架是基于Java与MySQL环境构建的,利用了常见的设计...

    一款极其轻量的JAVA持久层框架,基于 SpringJdbc + freemarker 实现.zip

    一款极其轻量的JAVA持久层框架,基于 SpringJdbc + freemarker 实现,具备Mybatis一样的SQL分离和逻辑标签能力,可无缝集成springboot项目。 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++...

    java源码:数据持久层框架 Hibernate.zip

    **Java 源码分析:数据持久层框架 Hibernate** Hibernate 是一个强大且广泛使用的 Java 数据持久层框架,它简化了数据库操作,使开发者能够通过对象关系映射(ORM)技术将 Java 对象与数据库表进行无缝对接。在这个...

    Java高手真经_应用框架卷_Java_Web核心框架.part1.rar

     持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、oracle、sql server数据库的信息系统开发。  持久层框架ibatis:讲解ibatis入门与核心技术,分别实现mysql、oracle、sql server数据库的信息...

    Mybatis系列教程自定义持久层框架共15页.pdf.z

    Mybatis 是一款流行的轻量级Java持久层框架,它提供了灵活的SQL映射机制和简单的ORM(对象关系映射)解决方案。本教程旨在深入解析Mybatis的自定义持久层框架,帮助开发者更好地理解和掌握其核心功能,从而实现高效...

    一个数据持久层框架的设计文档-java

    综上所述,这个Java数据持久层框架通过XML配置和SQL语句的封装,实现了数据库操作的简化和模块化。其核心在于动态加载SQL,缓存机制和灵活的扩展性,旨在提高开发效率和系统性能。通过清晰的工作流程,开发人员可以...

    Java高手真经 应用框架卷 源码

    持久层框架Hibernate:讲解Hibernate入门与核心技术,分别实现MySQL、Oracle、SQL Server数据库的信息系统开发。持久层框架iBATIS:讲解iBATIS入门与核心技术,分别实现MySQL、Oracle、SQL Server数据库的信息系统...

    MyBatis数据持久层框架 v3.5.15.zip

    MyBatis是一个流行的Java数据持久层框架,它简化了数据库操作并与对象关系映射(ORM)相结合,使得开发人员能够方便地将SQL语句与Java代码整合在一起。在这个"MyBatis数据持久层框架 v3.5.15.zip"压缩包中,包含的是...

    Java高手真经_应用框架卷_Java_Web核心框架.part3.rar

     持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、oracle、sql server数据库的信息系统开发。  持久层框架ibatis:讲解ibatis入门与核心技术,分别实现mysql、oracle、sql server数据库的信息...

    Java高手真经_应用框架卷_Java_Web核心框架.part2.rar

     持久层框架hibernate:讲解hibernate入门与核心技术,分别实现mysql、oracle、sql server数据库的信息系统开发。  持久层框架ibatis:讲解ibatis入门与核心技术,分别实现mysql、oracle、sql server数据库的信息...

    Java源码分析 【源码笔记】专注于Java后端系列框架的源码分析,每周持续推出Java后端系列框架的源码分析文章。.zip

    5. **MyBatis**:MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。通过源码分析,我们可以学习到数据库操作的优化技巧,以及如何优雅地处理ORM(对象关系映射)。 6. **设计模式**:在源码...

    精通Hibernate:Java持久化对象技术详解[第二版]

    Hibernate是Java开发领域中广泛使用的持久层框架,它允许开发者将数据库操作与业务逻辑解耦,通过对象模型来管理和操作数据,大大简化了传统SQL编程的复杂性。 本书内容涵盖了Hibernate的基础知识到高级应用,包括...

    Java对象持久化技术概述

    ### Java对象持久化技术概述 ...通过合理设计持久化层并利用像Hibernate这样的成熟框架,开发者可以构建出高性能且易于维护的Java应用。同时,理解并正确运用不同层次的模型也有助于构建更加清晰、灵活的软件架构。

    Web开发+java+ssh框架

    一、Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系。Hibernate可以用在任何JDBC可以使用的场合,例如Java 应用程序的数据库访问代码,DAO接口的实现类...

    Hibernate数据持久层框架 v5.4.21-源码.zip

    《深入理解Hibernate数据持久层框架 v5.4.21》 Hibernate,作为一个开源的Java对象关系映射(ORM)框架,是Java开发者在处理数据库操作时的强大工具。它的核心功能在于将Java类与数据库表进行映射,使得开发者可以...

    Java SSH 框架整合,学习源码

    这些框架在企业级应用开发中扮演着重要角色,分别负责控制层、视图层和持久层的管理。下面将详细介绍SSH框架整合的相关知识点。 1. **Spring框架**:Spring是一个全面的后端应用程序框架,它提供了依赖注入(DI)和...

    SpringBoot框架, springboot 多层框架 留言板源码 layui,java

    对于数据库交互,SpringBoot支持JPA(Java Persistence API)和MyBatis等持久层框架。 至于标签中的“Ajax”,它是一种在不刷新整个页面的情况下与服务器进行通信的技术。在SpringBoot应用中,可以利用Jackson库...

    java 管理系统,采用框架构成

    5. **JSP和Servlet**:分析系统中的JSP页面和Servlet,理解它们在视图和控制层的角色。 6. **实践操作**:尝试修改部分功能,部署并运行系统,体验开发流程。 通过以上步骤,Java初学者不仅可以学习到实际项目的...

Global site tag (gtag.js) - Google Analytics