MyBatis 与Hibernate 有哪些不同?
SQL 和 ORM 的争论,永远都不会终⽌
开发速度的对⽐:
-
Hibernate
的真正掌握要⽐Mybatis难些。 -
Mybatis
框架相对简单很容易上⼿,但也相对简陋些。 -
⽐起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项⽬需求去考虑究竟哪⼀个更适合项⽬开发
- ⽐如:⼀个项⽬中⽤到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了,
- 因为基本的sql语句已经被封装好了,根本不需要你去写sql语句,这就节省了⼤量的时间
- 但是对于⼀个⼤型项⽬,复杂语句较多,这样再去选择hibernate就不是⼀个太好的选择
- 选择mybatis 就会加快许多,⽽且语句的管理也⽐较⽅便。
开发⼯作量的对⽐:
Hibernate
和MyBatis
都有相应的代码⽣成⼯具,可以⽣成简单基本的DAO层⽅法。- 针对⾼级查询,Mybatis需要⼿动编写SQL语句,以及ResultMap。
- ⽽Hibernate有良好的映射机制,开发者⽆需关⼼SQL的⽣成与结果映射,可以更专注于业务流程
sql优化⽅⾯:
-
Hibernate的查询会将表中的所有字段查询出来,这⼀点会有性能消耗。
-
Hibernate也可以⾃⼰写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。
-
⽽Mybatis的SQL是⼿动编写的,所以可以按需求指定查询的字段。
-
Hibernate HQL语句的调优需要将SQL打印出来,⽽Hibernate的SQL被很多⼈嫌弃因为太丑了。
-
MyBatis的SQL是⾃⼰⼿动写的所以调整⽅便。
-
但Hibernate具有⾃⼰的⽇志统计。Mybatis本身不带⽇志统计,使⽤Log4j进⾏⽇志记录。
对象管理的对⽐:
-
Hibernate 是完整的对象/关系映射解决⽅案
- 它提供了对象状态管理(state management)的功能, 使开发者不再需要理会底层数据库系统的细节。
- 也就是说,相对于常⻅的 JDBC/SQL 持久层⽅案中需要管理 SQL 语句
- Hibernate采⽤了更⾃然的⾯向对象的视⻆来持久化 Java 应⽤中的数据。
-
换句话说,使⽤ Hibernate 的开发者应该总是关注对象的状态(state),不必考虑 SQL 语句的执⾏。
-
这部分细节已经由 Hibernate 掌管妥当,只有开发者在进⾏系统性能调优的时候才需要进⾏了解。
-
⽽ MyBatis在这⼀块没有⽂档说明,⽤户需要对对象⾃⼰进⾏详细的管理。
缓存机制对⽐:
-
相同点
:都可以实现⾃⼰的缓存或使⽤其他第三⽅缓存⽅案,创建适配器来完全覆盖缓存⾏为。 -
不同点
:- Hibernate的⼆级缓存配置在SessionFactory⽣成的配置⽂件中进⾏详细配置,然后再在具体的表-对象映射中配置是哪种缓存。
- MyBatis的⼆级缓存配置都是在每个具体的表-对象映射中进⾏详细配置,这样针对不同的表可以⾃定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
-
两者⽐较:因为Hibernate对查询对象有着良好的管理机制,⽤户⽆需关⼼SQL。所以在使⽤⼆级缓存时如果出现脏数据,系统会报出错误并提示。
-
⽽MyBatis在这⼀⽅⾯,使⽤⼆级缓存时需要特别⼩⼼。如果不能完全确定数据更新操作的波及范围,避免Cache的盲⽬使⽤。否则,脏数据的出现会给系统的正常运⾏带来很⼤的隐患。
-
Hibernate功能强⼤,数据库⽆关性好,O/R映射能⼒强,如果你对Hibernate相当精通,⽽且对Hibernate进⾏了适当的封装,那么你的项⽬整个持久层代码会相当简单,需要写的代码很少,开发速度很快,⾮常爽。
-
Hibernate
的缺点就是学习⻔槛不低,要精通⻔槛更⾼,⽽且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样⽤好Hibernate⽅⾯需要你的经验和能⼒都很强才⾏。 -
MyBatis⼊⻔简单,即学即⽤,提供了数据库查询的⾃动对象绑定功能,⽽且延续了很好的SQL使⽤经验,对于没有那么⾼的对象模型要求的项⽬来说,相当完美。
-
MyBatis的缺点
就是框架还是⽐较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要⾃⼰写的,⼯作量也⽐较⼤,⽽且不太容易适应快速数据库修改。