前面我已经通过简单的例子,初次认识mybaits。在写此篇博文的时候我还是有很多问题,比如mybaits实现过程通过接口就能实现,它是怎么做到的。在我看来hibernate已经做得很不错了,mybatis作为持久层高调与hibernate竞争,它真的能抢走半壁江山。原本这篇文章应该放在mybatis开篇来写,但是我觉得对mybatis有了初步的认识后,再回头看看它与hibernate的区别会有不同的感受。
一 、背景
Hibernate :属于JBOSS。Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作。程序员甚至不需要对SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。
Mybatis :属于Apache。iBATIS 的着力点,则在于POJO 与SQL之间的映射关系(hibernate在处理高复杂的sql语句时就没mybatis方便)。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。 相对Hibernate“O/R”而言,iBATIS 是一种“Sql Mapping”的ORM实现。
二 、性能
二者实现相同的功能:
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)
综上:
3.删除数据
Hibernate3在44000条数据中,随机删除一条数据,耗时:41毫秒
MyBatis3在44000条数据中,随机删除一条数据,耗时:40.1毫秒
4.修改数据
也许是测试次数太少,在修改这方面,我认为数据还是存在一定偏差。
Hibernate3随机修改一条数据,耗时:18.1毫秒
MyBatis随较修改一条数据,耗时:3.2毫秒
5.查询一条记录
Hibernate3随机查询一条数据,耗时:12.2毫秒
MyBatis随较查询一条数据,耗时:5.6毫秒
6.删除所有数据
Hibernate3删除45991条数据,耗时:812毫秒,平均每条56.6毫秒
MyBatis删除46259条数据,耗时:906毫秒,平均每条51.0毫秒
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的延迟加载是全局配置的。
五、缓存机制Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。
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的区别,会伴随着学习的深入,感触也会越来越深。因此有些无法理解的问题也不要紧,我们可以暂且记下,日后再回头看这些问题,会有不一样的体会和感触。