MyBatis与Hibernate区别

背景:在中国网安的面试过程中遇到这个问题,好长时间没用了,说不出个所以然来。
MyBatis 与 Hibernate 区别

7、Hibernate 与 MyBatis 对比

7.1 相同点

Hibernate 与 MyBatis 都可以是通过 SessionFactoryBuider 由 XML 配置文件生成SessionFactory,然后由 SessionFactory 生成 Session,最后由 Session 来开启执行事务和 SQL 语句

其中 SessionFactoryBuider,SessionFactory,Session 的生命周期都是差不多的。Hibernate 和 MyBatis 都支持 JDBC 和 JTA 事务处理。

7.2 不同点

(1)hibernate 是全自动,而 mybatis 是半自动

hibernate 完全可以通过对象关系模型实现对数据库的操作,拥有完整的 JavaBean 对象与数据库的映射结构来自动生成 sql。而 mybatis 仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写 sql 来实现和管理。

(2)hibernate 数据库移植性远大于 mybatis

hibernate 通过它强大的映射结构和 hql 语言,大大降低了对象与数据库(Oracle、MySQL 等)的耦合性,而 mybatis 由于需要手写 sql,因此与数据库的耦合性直接取决于程序员写 sql 的方法,如果 sql 不具通用性而用了很多某数据库特性的 sql 语句的话,移植性也会随之降低很多,成本很高。

(3)hibernate 拥有完整的日志系统,mybatis 则欠缺一些

hibernate 日志系统非常健全,涉及广泛,包括:sql 记录、关系异常、优化警告、缓存提示、脏数据警告等;而 mybatis 则除了基本记录功能外,功能薄弱很多。

(4)mybatis 相比 hibernate 需要关心很多细节

hibernate 配置要比 mybatis 复杂的多,学习成本也比 mybatis 高。但也正因为 mybatis 使用简单,才导致它要比 hibernate 关心很多技术细节。mybatis 由于不用考虑很多细节,开发模式上与传统 jdbc 区别很小,因此很容易上手并开发项目,但忽略细节会导致项目前期 bug 较多,因而开发出相对稳定的软件很慢,而开发出软件却很快。hibernate 则正好与之相反。但是如果使用 hibernate 很熟练的话,实际上开发效率丝毫不差于甚至超越 mybatis。

(5)sql 直接优化上,mybatis 要比 hibernate 方便很多

由于 mybatis 的 sql 都是写在 xml 里,因此优化 sql 比 hibernate 方便很多。而 hibernate 的 sql 很多都是自动生成的,无法直接维护 sql;虽有 hql,但功能还是不及 sql 强大,见到报表等变态需求时,hql 也歇菜,也就是说 hql 是有局限的;hibernate 虽然也支持原生 sql,但开发模式上却与 orm 不同,需要转换思维,因此使用上不是非常方便。总之写 sql 的灵活度上 hibernate 不及 mybatis。

(6)缓存机制上,hibernate 要比 mybatis 更好一些

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

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

8、总结

(1)两者相同点
Hibernate 和 Mybatis 的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。

(2)两者不同点
Hibernate 的二级缓存配置在 SessionFactory 生成的配置文件中进行详细配置,然后再在具体的表 - 对象映射中配置是那种缓存。而 MyBatis 在使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免 Cache 的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。

(3)举个形象的比喻

MyBatis:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使由我决定。(小巧、方便、高效、简单、直接、半自动)

Hibernate:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以摆脱他了,但仅限于它能做的事。(强大、方便、高效、复杂、绕弯子、全自动)



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,让更多的人能够享受到获取知识的快乐!因为本人初入职场,鉴于自身阅历有限,所以本博客内容大部分来源于网络中已有知识的汇总,欢迎各位转载,评论,大家一起学习进步!如有侵权,请及时和我联系,切实维护您的权益!