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性能优化的思路及策略
数据库·sql·性能优化
壹佰大多2 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
DokiDoki之父2 小时前
Spring—注解开发
java·后端·spring
源力祁老师2 小时前
ODOO数据文件(XML、CSV、SQL)是如何转换并加载到 Odoo 数据库
xml·数据库·sql
提笔了无痕2 小时前
什么是Redis的缓存问题,以及如何解决
数据库·redis·后端·缓存·mybatis
lang201509283 小时前
Spring Boot SQL数据库全攻略
数据库·spring boot·sql
catoop4 小时前
Sprintf Boot 之 Nacos 配置中心实践(spring.config.import=optional:nacos:)
spring·springboot
keke_俩个科5 小时前
ShardingSphere分库分表基础配置与使用说明
java·数据库·分布式·spring
2401_841495645 小时前
【数据库开发】个人信息管理的数据库创建以及查询方法(最简单)
数据库·sql·mysql·sqlite·数据库开发·个人数据库·管理个人信息
南部余额5 小时前
Spring MVC 拦截器interceptor
java·spring·mvc