Mybatis与Hibernate的区别
以前没怎么用过mybatis,只知道与hibernate一样是个orm数据库框架。随着使用熟练度的增加,发现它与hibernate区别是非常大的感兴趣的朋友通过本文一起学习吧
趁着这个周末,抽空把一些常用的技术整理出来,小编还会不定期的更新内容。
首先简单介绍下两者的概念:
hibernate :hibernate 是当前最流行的orm框架,对数据库结构提供了较为完整的封装。
mybatis:mybatis同样也是非常流行的orm框架,主要着力点在于pojo 与sql之间的映射关系。
其次具体从几个方面说一下两者的区别:
1.两者最大的区别:
针对简单逻辑,hibernate和mybatis都有相应的代码生成工具,可以生成简单基本的dao层方法。
针对高级查询,mybatis需要手动编写sql语句,以及resultmap。而hibernate有良好的映射机制,开发者无需关心sql的生成与结果映射,可以更专注于业务流程。
2.开发难度对比
hibernate的开发难度要大于mybatis。主要由于hibernate比较复杂、庞大,学习周期较长。
而mybatis则相对简单一些,并且mybatis主要依赖于sql的书写,让开发者感觉更熟悉。
3.sql书写比较
mybatis的sql是手动编写的,所以可以按需求指定查询的字段。不过没有自己的日志统计,所以要借助log4j来记录日志。
hibernate也可以自己写sql来指定需要查询的字段,但这样就破坏了hibernate开发的简洁性。不过hibernate具有自己的日志统计。
4.数据库扩展性比较
mybatis由于所有sql都是依赖数据库书写的,所以扩展性,迁移性比较差。
hibernate与数据库具体的关联都在xml中,所以hql对具体是用什么数据库并不是很关心。
5.缓存机制比较
相同点:hibernate和mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。
不同点:hibernate的二级缓存配置在sessionfactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。
mybatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且mybatis可以在命名空间*享相同的缓存配置和实例,通过cache-ref来实现。
两者比较:因为hibernate对查询对象有着良好的管理机制,用户无需关心sql。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。
而mybatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。
6.总结:
mybatis:小巧、方便、高效、简单、直接、半自动
hibernate:强大、方便、高效、复杂、绕弯子、全自动
hibernate与mybatis都可以是通过sessionfactorybuider由xml配置文件生成sessionfactory,然后由sessionfactory 生成session,最后由session来开启执行事务和sql语句。
而mybatis的优势是mybatis可以进行更为细致的sql优化,可以减少查询字段,并且容易掌握。
hibernate的优势是dao层开发比mybatis简单,mybatis需要维护sql和结果映射。数据库移植性很好,mybatis的数据库移植性不好,不同的数据库需要写不同sql。有更好的二级缓存机制,可以使用第三方缓存。mybatis本身提供的缓存机制不佳。
mybatis:
1. 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的sql使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
2. 可以进行更为细致的sql优化,可以减少查询字段。
3. 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
4. 二级缓存机制不佳。
hibernate:
1. 功能强大,数据库无关性好,o/r映射能力强,如果你对hibernate相当精通,而且对hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
2. 有更好的二级缓存机制,可以使用第三方缓存。
3. 缺点就是学习门槛不低,要精通门槛更高,而且怎么设计o/r映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好hibernate方面需要你的经验和能力都很强才行。
举个形象的比喻:
mybatis:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使由我决定。
hibernate:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以摆脱他了,但仅限于它能做的事。