1.开发速度对比
Hibernate的学习成本要比MyBatis高,MyBits框架相对容易上手。比较二者的开发速度,不仅要考虑两者的特性及性能,更要考虑项目需求究竟哪个更适合开发,比如:
一个项目中用到的复杂查询基本没有,就是最基本的增删改查,这样选择Hibernate的效率就要高些了,因为基本的SQL语句已经被封装好,根本不需要手写SQL,可以节省大量时间,但是对于一个大型项目,复杂的查询语句较多,使用MyBatis就会加快很多,而且SQL语句管理也会很方便。
2.开发工作量对比
MyBatis与Hibernate都有相应的代码生成工具,可以生成简单的DAO层方法。针对高级查询,MyBatis需要手动编写SQL语句及resultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更关注于业务流程。
3.SQL优化方面
Hibernate的查询会将表中的所有字段查询出来,这一点会消耗性能。Hibernate也可以自己手写SQL指定要查询的字段,但这样就会破坏了Hibernate开发的简洁性,一般不推荐。而MyBatis的SQL语句是自己手写的,我们可以根据需求指定要查询的字段。
Hibernate的HQL语句调优需要将SQL打印出来,MyBatis的SQL是自己手动写的所以调整方便。但Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录。
4.对象管理的对比
Hibernate 是完整的对象/关系映射解决方案,它提供了对象状态管理(state management)的功能,使开发者不再需要理会底层数据库系统的细节。也就是说,相对于常见的 JDBC/SQL 持久层方案中需要管理 SQL 语句,Hibernate采用了更自然的面向对象的视角来持久化 Java 应用中的数据。
换句话说,使用 Hibernate 的开发者应该总是关注对象的状态(state),不必考虑 SQL 语句的执行。这部分细节已经由 Hibernate 掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。而MyBatis在这一块没有文档说明,用户需要对对象自己进行详细的管理。
5.缓存机制
Hibernate缓存
①一级缓存
Hibernate一级缓存是Session缓存(内置缓存),一级缓存在Session中实现,当Session关闭一级缓存即失效。
使用contains方法来判断对象是否存在一级缓存中:
image.png
另外:
- clear方法用于将所有对象从一级缓存中清除
-
evict方法用于将指定对象从一级缓存中清除
image.png
②二级缓存
Hibernate二级缓存是SessionFactory级的缓存。在Hibernate中二级缓存在SessionFactory中实现,由一个SessionFactory的所有Session实例所共享。
Session在查找一个对象时,会首先在自己的一级缓存中进行查找,如果没有找到,则进入二级缓存中进行查找,如果二级缓存中存在,则将对象返回,如果二级缓存中也不存在,则从数据库中获得。
Hibernate并未提供对二级缓存的产品化实现,而是为第三方缓存组件的使用提供了接口,当前Hibernate支持的第三方二级缓存的实现如下:
• EHCache
• Proxool
• OSCache
• SwarmCache
• JBossCache
下面介绍一下EHCache的使用:
导入jar包
添加ehcache.xml
设置二级缓存
//ehcache.xml
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory=“10000“ →缓存中最大允许保存的对象数量
eternal=“false“ →缓存中数据是否为常量
timeToIdleSeconds=“120“ →缓存数据钝化时间,单位为秒
timeToLiveSeconds=“120“ →缓存数据生存时间,单位为秒
overflowToDisk=“true“ →内存不足时,是否启用磁盘缓存
/>
</ehcache>
开启二级缓存:
//hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
…
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
…
</session-factory>
</hibernate-configuration>
MyBatis缓存
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。
默认情况下是没有开启缓存的,除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:
<cache/>
作用:
• 映射语句文件中所有的select语句将被缓存
• 映射语句文件中的所有insert、update、delete语句会刷新缓存
• 缓存会使用least recentily used(LRU,最近很少使用的)算法来收回
• 根据时间间隔来刷新缓存,默认不刷新
• 缓存会存储列表集合或对象的1024个引用
• 缓存被视为read/write的缓存
注意:
select语句中设置useCache = "false"将不被缓存;
语句中设置flushCache = "false"将不刷新缓存;
pojo类必须是可序列化类。
不同点:
Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。
MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
两者比较:
因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。
而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。
6.优势对比
Mybatis优势
- MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
- MyBatis容易掌握,而Hibernate门槛较高。
Hibernate优势
- Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
- Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
- Hibernate功能强大,数据库无关性好,O/R映射能力强。Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
- Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
网友评论