MyBatis 与 Hibernate 比较和区别

MyBatis 和 Hibernate 之间有很大的区别,Hibernate 以 Java 对象为中心,是一种 ORM,MyBatis 以 SQL 为中心,是加强版 SQL,两者适用场景不一样。

 

1. MyBatis 与 Hibernate 相同点

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

其中 SessionFactoryBuider,SessionFactory,Session 的生命周期基本相同。Hibernate 和 MyBatis 都支持 JDBC 和 JTA 事务处理。

Hibernate 和 MyBatis 都与 Spring 框架兼容,从框架角度来看用哪个都不是问题。

 

2. MyBatis 与 Hibernate 不同点

(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 是有局限的;Hibernate 虽然也支持原生 SQL,但开发模式上却与 orm 不同,需要转换思维,因此使用上不是非常方便。总之写 SQL 的灵活度上 Hibernate 不及 MyBatis。

(6)缓存机制上,Hibernate 要比 MyBatis 更好一些

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

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

(7)使用存储过程

在 MyBatis 中使用存储过程非常容易,在 Hibernate 中使用存储过程有点困难。

 

3. MyBatis 使用场景:

  • 希望直接优化维护 SQL
  • 系统由关系数据模型驱动
  • 必须处理现有数据或复杂数据

通常 Web 项目中使用 MyBatis 较多,如果环境是由对象模型驱动的,则使用 Hibernate。

MyBatis 是一款基于 Java 的持久层框架,它支持定制化 SQL、存储过程以及高级映射。对于经常使用 IDEA 进行 Java 开发,可以按照本教程配置 MyBatis。本文使用的实验环境:IDEA2020.1 + MySQL8.0.21 + Mybatis3.5.5 + Junit4.13。