现在的位置: 首页 > 综合 > 正文

Ibatis与Hibernate比较

2013年07月01日 ⁄ 综合 ⁄ 共 3443字 ⁄ 字号 评论关闭

        本次项目的持久层用的是ibatis,也是一个持久层框架。之前一直接触的是Hibernate,两者都是很优秀的开源持久层产品。所以就不可避免的将两者比较一下了。
 
1.出身 

         hibernate 是当前最流行的o/r mapping框架,它出身于sf.net,现在已经成为jboss的一部分了。 
ibatis 是另外一种优秀的o/r mapping框架,目前属于apache的一个子项目了。 

2.原理 

        相对hibernate“o/r”而言,ibatis是一种“sql mapping”的orm实现。hibernate 对数据库结构提供了较为完整的封装,hibernate的o/r mapping实现了pojo 和数据库表之间的映射,以及sql 的自动生成和执行。程序员往往只需定义好了pojo 到数据库表的映射关系,即可通过hibernate 提供的方法完成持久层操作。程序员甚至不需要对sql 的熟练掌握, hibernate/ojb 会根据制定的存储逻辑,自动生成对应的sql 并调用jdbc 接口加以执行。 
        而ibatis 的着力点,则在于pojo 与sql之间的映射关系。也就是说,ibatis并不会为程序员在运行期自动生成sql 执行。具体的sql 需要程序员编写,然后通过映射配置文件,将sql所需的参数,以及返回的结果字段映射到指定pojo。 
 
        在sql语句是自动生成好还是全手写好,这还要看项目对sql语句的要求。
        iBATIS需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比Hibernate要大很多。类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sqlmapping的地方一一修改。
        但是比如说我有一个表,这个表有几个或者几十个字段,我需要更新其中的一个字段,iBatis 很简单,执行一个sqlUPDATE TABLE_A SET column_1=#column_1# WHERE id=#id# 但是用Hibernate 的话就比较麻烦了,缺省的情况下hibernate 会更新所有字段。虽然可以在配置文件里配置单个字段不更新。但如果只是一个位置不需要更新其他的需要那就不行了。

3.机制 

        使用ibatis 提供的orm机制,对业务逻辑实现人员而言,面对的是纯粹的java对象。这一层与通过hibernate 实现orm 而言基本一致,而对于具体的数据操作,hibernate会自动生成sql 语句,而ibatis则要求开发者编写具体的sql 语句。相对hibernate而言,ibatis 以sql开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。  

4.基本使用 

Hibernate:
         重点是Session对象:
         Session是持久层操作的基础,相当于JDBC中的Connection:
         实例通过SessionFactory实例构建:
         Configuration config = newConfiguration().configure();
         SessionFactory sessionFactory =config.buildSessionFactory();
         Sessionsession = sessionFactory.openSession();
         之后我们就可以调用Session所提供的save、find、flush等方法完成持久层操作。因此Session对象也封装了所有对数据库的操作来实现Hibernate对数据库的操纵功能,如:
        Save()方法实现增加和保存;
         Delete()方法实现数据的删除;
         Update()方法实现数据更新和修改;
         Find()方法实现数据的检索;
         Hibernate会根据不同的操作自动生成相应的SQL语句,从而实现了程序员对PO对象的操作转化为对数据库关系表的操作。  

Ibatis:

         重点是SqlMapClient对象,它是ibatis持久层操作的基础,相当于hibernate中的session,提供对SQL映射的方法。
         insert()方法实现对插入SQL语句的映射;
         delete()方法实现对删除SQL语句的映射;
         update()方法实现对更新SQL语句的影射;
         queryForList()、queryForMap()、queryForObject()、queryForPaginatedList()等方法提供了一组查询SQL语句的影射;


5.开发和维护方面 

         开发效率上,两者应该差不多。可维护性方面,我觉得 iBatis 更好一些。因为 iBatis 的 sql 都保存到单独的文件中。而 Hibernate 在有些情况下可能会在 java 代码中保sql/hql,那当然就不方便修改了。相对Hibernate“O/R”而言,iBATIS是一种“Sql Mapping”的ORM实现。

6.二次开发 

        当系统属于二次开发,无法对数据库结构做到控制和修改,那ibatis的灵活性将比hibernate更适合 

7.海量数据 

        系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的sql语句(或存储过程)才能达到系统性能设计指标。在这种情况下ibatis会有更好的可控性和表现。 

8.自动化程度 

         ibatis需要手写sql语句,也可以生成一部分,hibernate则基本上可以自动生成,偶尔会写一些hql。同样的需求,ibatis的工作量比hibernate要大很多。类似的,如果涉及到数据库字段的修改,hibernate修改的地方很少,而ibatis要把那些sql mapping的地方一一修改。 

9.与数据映射关系 

        ibatis以数据库字段一一对应映射得到的po和hibernte这种对象化映射得到的po是截然不同的,本质区别在于这种po是扁平化的,不像hibernate映射的po是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。


ibatis的作者对两者的评价是: 
         if you are starting a new project andyou're in full control of your object model and database design, hibernate is agood choice of o/r tool. 
         if you are accessing any 3rd partydatabases (e.g. vendor supplied), or you're working with a legacy database, oreven just a really poorly designed database, then an o/r mapper might not becapable of handling the situation. that's were an sql mapper
comes in handy.

           

总述:

         Hibernate较为重量级一些,Hibernate功能强大,数据库无关性好,O/R映射能力强,为用户考虑的非常周全了,很多都不需要用户动手,不懂sql语句也可以编程,非常方便。而且从pojo到数据库的映射上非常面向对象,而且对象很有立体感。如果对Hibernate相当精通,对性能和对象模型之间可以取得平衡,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快。缺点就是上手比较难。但总体的完善性上超过ibatis。
 
         而ibatis就轻量一些,框架还比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。但也因此却比较灵活,而且入门简单,即学即用,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当适合。所以如果对sql语句的性能要求较高,对数据库设计不了解,还是得选择ibatis。


         我们的项目涉及大数据量,也就对sql的性能优化比较重视,应该也是选择了ibatis的最大原因。

抱歉!评论已关闭.