ORM框架MyBatis与Hibernate比较

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关闭一流缓存即失效。

user2的查询会采用顶尖缓存

利用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本身提供的缓存机制糟糕。
网站地图xml地图