简介:
Hibernate:ORM(对象关系映射)框架之一,对JDBC提供了比较完整的封装。Hibernate的O/R Mapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。
MyBatis:ORM框架之一,主要着力点在于POJO和SQL之间的映射关系。通过映射配置文件,将SQL所需的参数以及返回的结果字段映射到指定POJO。相对于Hibernate的O/R Mapping,MyBatis是一种SQL Mapping的实现。
对比:
1、开发
难易度:
Hibernate的真正掌握要比MyBatis困难,Hibernate要比MyBatis更加重量级些
MyBatis框架相对简单容易上手,但也相对简陋
开发工作量:
Hibernate和MyBatis都有对应的代码生成工具,可以生成基本的DAO层方法
MyBatis需要我们手动编写SQL语句,回归最原始的方式,所以可以按需求指定查询字段,提高查询效率
2、数据库移植性
MyBatis由于所有SQL都是依赖数据库编写的,所以扩展性、迁移性比较差
Hibernate与数据库具体的关联都在XML中,HQL对具体是什么数据库并不是很关心
3、缓存机制
Hibernate缓存
Hibernate一级缓存是session缓存,利用好一级缓存就需要对session的生命周期进行管理好,
Hibernate的二级缓存是SessionFactory级的缓存,SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。
MyBatis缓存
MyBatis包含一个非常强大的查询缓存特性,可以非常方便的配置和定制。
MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
二者由于缓存引发的脏数据问题
因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。
而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。
4、调优方案
Hibernate的调优方案:
1.制定合理的缓存策略;
2.尽量使用延迟加载特性;
3.采用合理的Session管理机制;
4.使用批量抓取,设定合理的批处理参数(batch_size);
5.进行合理的O/R映射设计
Mybatis调优方案:
MyBatis在Session方面和Hibernate的Session生命周期是一致的,同样需要合理的Session管理机制。MyBatis同样具有二级缓存机制。MyBatis可以进行详细的SQL优化设计。
5、SQL优化
Hibernate的查询会将表中所有的字段查询出来,会有性能损耗。Hibernate也可以自己写SQL来制定需要查询的字段,但是这样就破坏了Hibernate开发的简洁性。而MyBatis是手动编写SQL的,可以按照需求指定查询的字段。
6、日志
Hibernate拥有完整的日志系统,包括:SQL记录、关系异常、优化警告、缓存提示、脏数据警告等;而MyBatis除了基本的记录功能外,功能薄弱很多。
总结
MyBatis:
简单、易上手、更加灵活、适合复杂SQL查询、半自动、可以进行更为细致的SQL优化、工作量比较大,底层的SQL需要自己写、二级缓存机制不佳
Hibernate:
强大、方便、移植性好、更好的二级缓存机制、健全的日志系统、全自动、复杂、学习门槛高