前言
这篇博文主要是对当前比较流行的两个持久层框架做一个对比,并不涉及框架的介绍和使用。
一个优秀的程序员不仅要有很强的能力,效率的提升也是很重要的,选择一个适合自己的框架能够达到事半功倍的效果。开发者使用相同的框架做开发也能提高代码维护性,方便后面的程序员做二次开发。那么接下来我们就对当前的两大持久层框架做个详细得对比:
一、简介
Hibernate:全自动的框架,是当前最流行的ORM框架之一,对于JDBC提供了比较完整的Hibernate的 O/R Mapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。
Mybatis:半自动框架,也是现在非常流行的ORM框架之一,主要着力点在于POJO于SQL之间的映射关 系。然后通过映射的配置文件,将sql所需要的参数以及返回的字段映射到指定的POJO。相对于 hibernate的O/R而言,mybatis是一种Sql Mapping的ORM实现。
二、开发效率
- 难易度
Mybatis是一个轻量级的框架,相对容易上手,同时也相对简陋一些;而Hibernate比Mybatis更加重量级一些,也更难掌握一些,实现了较好的封装,真正掌握要比Mybatis来得难些,个人觉得要用好Mybatis还是首先要先理解好Hibernate。
- 开发工作量
Mybatis采用的是最原始的方式,需要手动编写sql语句,同时也可以根据需求指定查询字段和约束条件,提高查询效率;Hibernate采用的是封装sql语句,对外暴露执行sql的方法。Hibernate也可以编写自定义的sql语句来执行需要查询的字段,但是这样会破坏框架原有的封装和简洁性。针对高级查询,Mybatis需要手动编写sql语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心sql的生成与结果映射,可以更专注于业务流程。
三、调优对比
1、系统调优
- Hibernate
制定合理的缓存策略;
尽量使用延迟加载特性;
采用合理的Session管理机制;
使用批量抓取,设定合理的批处理参数;
进行合理的O/R映射设计。
- Mybatis
MyBatis在Session方面和Hibernate的Session生命周期是一致的,同样需要合理的Session管理机制。MyBatis同样具有二级缓存机制。 MyBatis的sql语句都是开发者手动编写,可以进行详细的SQL优化设计。
2、SQL优化
Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。
HibernateSQL语句的调优需要将SQL打印出来,而Hibernate的SQL被很多人嫌弃因为太丑了。MyBatis的SQL是自己手动写的所以调整方便。但Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录。
3、扩展性
MyBatis项目中所有的SQL语句都是依赖所用的数据库,不同数据库类型支持不好,扩展性、迁移性比较差。Hibernate与数据库具体的关联都在XML中,所以hibernate对具体是用什么数据库并不是很关心。Hibernate与具体数据库的关联只需在XML文件中配置即可,所有的SQL语句与具体使用的数据库无关,移植性很好。
四、对象管理与抓取策略对象管理
(1)对象管理
Hibernate是完整的对象/关系映射解决方案,它提供了对象状态管理(state management)的功能,开发者不需要理会底层数据库系统的细节。相对于常见的 JDBC/SQL 持久层方案中需要管理 SQL 语句,Hibernate采用了更自然的面向对象的视角来持久化 Java 应用中的数据。也就是说,使用 Hibernate 的开发者应该关注对象的状态(state),而不是SQL 语句的执行,这部分细节已经由 Hibernate 掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。
而MyBatis在这一块没有文档说明,用户需要对对象自己进行详细的管理。
(2)抓取策略
Hibernate对实体关联对象的抓取有着良好的机制。对于每一个关联关系都可以详细地设置是否延迟加载,并且提供关联抓取、查询抓取、子查询抓取、批量抓取四种模式。它是详细配置和处理的。
而Mybatis的延迟加载是全局配置的。
五、缓存机制对比
- 相同点
Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。
- 不同点
Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间*享相同的缓存配置和实例,通过Cache-ref来实现。
- 二者比较
因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。而MyBatis在这一方面,使用二级缓存时需要特别小心,如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用,脏数据的出现会给系统的正常运行带来很大的隐患。
六、总结
- 相同点
Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
Hibernate和MyBatis都支持JDBC和JTA事务处理。
- 优势对比
Mybatis 优势可以进行更为细致的SQL优化,可以减少查询字段。
容易掌握,而Hibernate门槛较高。
Hibernate优势:
DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。