我们都知道MyBatis和Hibernate都是ORM(Object-Relation Mapping,对象关系映射)数据库框架,那么什么是对象关系映射呢?
其实从字面上意思来看,就是把关系与对象映射起来,关系指的是关系数据库,而对象指的是程序中的类对象。例如,数据库中有一个用户表user,该表中有三个字段(id,account,password),其中id是标识,那么这样一个表就可以在程序中映射成类“user.java”,该类中定义三个属性,对应表中三个字段。(最后还需要一个配置文件来对应)
两者对比
- MyBatis主要着力点在于 POJO 与 SQL 之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO。Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL的自动生成和执行,对JDBC提供了较为完整的封装。
- Mybatis框架相对简单很容易上手,功能也相对简单,需要我们手动编写SQL语句,当然这样可以按需求指定查询的字段,提高程序的查询效率;Hibernate相对较复杂,比较适合实现比较复杂的功能
-
Hibernate数据库移植性远大于MyBatis,Hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(Oracle、MySQL等)的耦合性,而MyBatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写SQL的方法,如果SQL不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。
-
Hibernate拥有完整的日志系统,MyBatis则欠缺一些。Hibernate日志系统非常健全,涉及广泛,包括:SQL记录、关系异常、优化警告、缓存提示、脏数据警告等;而MyBatis则除了基本记录功能外,功能薄弱很多。
在sql优化方面,Hibernate 自动生成sql,有些语句较为繁琐,会多消耗一些性能;Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;
Mybatis优势:
- MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
- MyBatis容易掌握,而Hibernate门槛较高。
Hibernate优势:
- Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
- Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
- Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
- Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。