49、MyBatis 与Hibernate 有哪些不同?

MyBatis 与Hibernate 有哪些不同?

SQL 和 ORM 的争论,永远都不会终止

一、开发速度的对比

Hibernate的真正掌握要比Mbatis难些。Mybatis框架相对简单很容易上手,但也相对简陋些。

比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发

比如:一个项目中用到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了,因为基本的sq语句已经被封装好了,根本不需要你去写sql语句,这就节省了大量的时间,但是对于一个大型项目,复杂语句较多,这样再去选择hibernate就不是一个太好的选择,选择mybatis就会加快许多,而且语句的管理也比较方便。

二、开发工作量的对比

Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程

三、sql优化方面

Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SOL来指定需要查询的字段,这样就破坏了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的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。

总结

  1. Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
  2. Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡
    取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
  3. MyBatis入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SOL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
    1.MyBatis的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
相关推荐
电魂泡哥5 小时前
SQL出现filesort 一定慢吗
数据库·sql
Java面试题总结8 小时前
java高频面试题(2026最新)
java·开发语言·jvm·数据库·spring·缓存
牧羊狼的狼9 小时前
浅谈电商下单微服务流程
spring·spring cloud·微服务
西安邮电大学10 小时前
SpringBean完整生命周期
java·spring
范什么特西10 小时前
Spring 动态代理 静态代理
java·后端·spring
醇氧10 小时前
Spring 动态注册 Bean 深度解析:从源码到实践
java·后端·spring
muddjsv11 小时前
SQL 最常用技能详解与实战示例
数据库·sql·mysql
vx-程序开发13 小时前
基于机器学习的动漫可视化系统的设计与实现-计算机毕业设计源码08339
java·c++·spring boot·python·spring·django·php
C137的本贾尼14 小时前
Spring AI Alibaba 开箱:国产百炼大模型初体验
java·人工智能·spring
这个DBA有点耶14 小时前
数据迁移避坑指南:从Oracle到国产数据库的兼容性问题
数据库·数据仓库·sql·oracle·dba