美文网首页程序员
ORM框架MyBatis与Hibernate对比

ORM框架MyBatis与Hibernate对比

作者: itcode | 来源:发表于2018-01-09 10:41 被阅读167次
    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本身提供的缓存机制不佳。

    相关文章

      网友评论

        本文标题:ORM框架MyBatis与Hibernate对比

        本文链接:https://www.haomeiwen.com/subject/jskwnxtx.html