百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

ORM框架MyBatis与Hibernate对比

toyiye 2024-06-21 12:17 10 浏览 0 评论

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方法用于将指定对象从一级缓存中清除



  • ②二级缓存
    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本身提供的缓存机制不佳。

学习更多JAVA知识与技巧,关注与私信博主(学习)

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码