mybatis学习笔记(三)mybatis和hibernate区别

前面我已经通过简单的例子,初次认识mybaits。在写此篇博文的时候我还是有很多问题,比如mybaits实现过程通过接口就能实现,它是怎么做到的。在我看来hibernate已经做得很不错了,mybatis作为持久层高调与hibernate竞争,它真的能抢走半壁江山。原本这篇文章应该放在mybatis开篇来写,但是我觉得对mybatis有了初步的认识后,再回头看看它与hibernate的区别会有不同的感受。

一   、背景

Hibernate :属于JBOSS。Hibernate数据库结构提供了较为完整的封装,HibernateO/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。

Mybatis :属于Apache。iBATIS 的着力点,则在于POJO SQL之间的映射关系(hibernate在处理高复杂的sql语句时就没mybatis方便)。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。 相对HibernateO/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。

二   、性能

性能总是我们在做出选择时一个重要的考量,我在网上找了这篇性能比较(感谢万能的程序猿)

1.从代码的编写量 
二者实现相同的功能: 
Hibernate3持久层用了207行Java代码,14行映射文件,18行Hibernate配置文件 
MyBatis持久层用了163行Java代码,36行映射文件,19行MyBatis配置文件 
所以从编码的角度我比较推荐MyBatis,因为它将Java代码和Sql做了映射,编码非常清晰。当然对于复杂的sql,
无论是Hibernate还是MyBatis,解决起来都够复杂的。 

2.增加数据 
Hibernate3增加1000条数据,平均每条耗时:27.6毫秒(具体数据:27000,26265,29609,27797,23938,30313,28375) 
MyBatis增加1000条数据,平均每条耗时:28.4毫秒(具体数据:29079,29359,31016,26375,26281,32475,24375) 
Hibernate3增加2000条数据,耗时61875毫秒,平均每条耗时30.9毫秒 
MyBatis增加2000条数据,耗时55515毫秒,平均每条耗时27.7毫秒 
Hibernate3增加5000条数据,耗时139500毫秒,平均每条耗时28.2毫秒 
MyBatis增加5000条数据,耗时127672毫秒,平均每条耗时25.5毫秒 
Hibernate3增加10000条数据,平均每条耗时28.1毫秒(具体数据:294922,274000,277109) 
MyBatis增加10000条数据,平均每条耗时26.9毫秒(具体数据:260343,272687,270031) 
综上:
 
数据增加效率mybatis优于hibernate

3.删除数据 
Hibernate3在44000条数据中,随机删除一条数据,耗时:41毫秒 
MyBatis3在44000条数据中,随机删除一条数据,耗时:40.1毫秒 
综上: 
删除效率mybatis和hibernate基本上持平

4.修改数据 
也许是测试次数太少,在修改这方面,我认为数据还是存在一定偏差。 
Hibernate3随机修改一条数据,耗时:18.1毫秒 
MyBatis随较修改一条数据,耗时:3.2毫秒 
综上: 
删除效率mybatis优于hibernate

5.查询一条记录  
Hibernate3随机查询一条数据,耗时:12.2毫秒 
MyBatis随较查询一条数据,耗时:5.6毫秒 
综上: 
删除效率mybatis优于hibernate

6.删除所有数据 
Hibernate3删除45991条数据,耗时:812毫秒,平均每条56.6毫秒 
MyBatis删除46259条数据,耗时:906毫秒,平均每条51.0毫秒 
综上: 
删除效率hibernate优于mybatis

7.回收表空间 
Hibernate3回收表空间,耗时62毫秒 
MyBatis回收表空间,耗时62毫秒 
这里需要说一下的是,Hibernate3中不能利用映射删除表空间,只能直接执行sql,具体可以参考文章:http://javapub.javaeye.com/blog/876147 
所以二者的回收方法都是同时执行sql,自然速度一致。 

8.源码下载 
MyBatis测试源码:http://www.zakisoft.com/wp-content/plugins/download-monitor/download.php?id=12 
Hibernate3测试源码:http://www.zakisoft.com/wp-content/plugins/download-monitor/download.php?id=13

以上就是网友的测试结果,数据的可靠性还学自己去核实和见证。


三  、对象管理

Hibernate 是完整的对象/关系映射解决方案。使用 Hibernate 的开发者应该总是关注对象的状态(state,不必考虑 SQL 语句的执行。这部分细节已经由 Hibernate 掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。MyBatis在这一块没有文档说明,用户需要对对象自己进行详细的管理。

四、延迟策略

Hibernate对实体关联对象的抓取有着良好的机制。对于每一个关联关系都可以详细地设置是否延迟加载,并且提供关联抓取、查询抓取、子查询抓取、批量抓取四种模式。 它是详细配置和处理的。Mybatis的延迟加载是全局配置的。

五、缓存机制

HibernateMybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。

Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。

MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。

MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。

对于Hibernate和Mybatis缓存具体用法和区别在后续会深入学习。

六、选择

选择合适的工具往往可以高效的解决战斗。成熟的工具没有好坏之分,只有适不适合。hibernate流行很久,所以在这块可能会比mybatis用友更多的粉丝群。但目前互联网的开发更偏向于mybatis,正式由于它sql语句的灵活性和开发的便捷性。由于mybatis是半自动持久化工具,所以对程序员sql水平也是一种考验。

七、总结

1、hibernate对jdbc进行深度封装,编写代码无需关注sql执行,mybatis轻度封装jdbc,需要关注sql执行(要求sql能力);

           2、hibernate可移植性比mybatis好,hibernate只需要该方言即可,mybaits要修改大量sql;

        3、hibernate可移植性比mybatis好(从oracle改为mysql数据库mybaits要修改大量sql);

4、hibernate的Dao层比mybatis开发简单(mybatis需要维护映射关系)

5、Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳

6、涉及到大数据的系统使用Mybatis比较好,因为优化较方便。涉及的数据量不是很大且对优化没有那么高,可以使用hibernate

7、hibernate性能浪费,查询时不必要的字段也带出来

8、mybatis可以很好的执行存储过程。

对于Mybatis和Hibernate的区别,会伴随着学习的深入,感触也会越来越深。因此有些无法理解的问题也不要紧,我们可以暂且记下,日后再回头看这些问题,会有不一样的体会和感触。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值