前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatis与Hibernate区别

MyBatis与Hibernate区别

作者头像
用户10358987
发布2024-04-23 19:50:23
930
发布2024-04-23 19:50:23
举报
文章被收录于专栏:javajava

1 简介

MyBatis

  • MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

Hibernate

  • Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。

2 对比

2.1 开发对比

开发难度

  • Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。

开发工作量

  • Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。
  • 针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
2.2 系统调优对比

Hibernate调优方案

  • 制定合理的缓存策略;
  • 尽量使用延迟加载特性;
  • 采用合理的Session管理机制;
  • 使用批量抓取,设定合理的批处理参数(batch_size);
  • 进行合理的O/R映射设计。

Mybatis调优方案

  • MyBatis在Session方面和Hibernate的Session生命周期是一致的,同样需要合理的Session管理机制。MyBatis同样具有二级缓存机制。MyBatis可以进行详细的SQL优化设计。

SQL优化方面

  • Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。
  • Hibernate HQL语句的调优需要将SQL打印出来,而Hibernate的SQL被很多人嫌弃因为太丑了。MyBatis的SQL是自己手动写的所以调整方便。但Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录。

扩展性方面

  • Hibernate与具体数据库的关联只需在XML文件中配置即可,所有的HQL语句与具体使用的数据库无关,移植性很好。MyBatis项目中所有的SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持不好。
2.3 对象管理与抓取策略

对象管理

  • Hibernate 是完整的对象/关系映射解决方案,它提供了对象状态管理(state management)的功能,使开发者不再需要理会底层数据库系统的细节。也就是说,相对于常见的 JDBC/SQL 持久层方案中需要管理SQL 语句,Hibernate采用了更自然的面向对象的视角来持久化 Java 应用中的数据。
  • 换句话说,使用 Hibernate 的开发者应该总是关注对象的状态(state),不必考虑 SQL 语句的执行。这部分细节已经由 Hibernate 掌管妥当,只有开发者在进行系统性能调优的时候才需要进行了解。
  • 而MyBatis在这一块没有文档说明,用户需要对对象自己进行详细的管理。

抓取策略

  • Hibernate对实体关联对象的抓取有着良好的机制。对于每一个关联关系都可以详细地设置是否延迟加载,并且提供关联抓取、查询抓取、子查询抓取、批量抓取四种模式。它是详细配置和处理的。
  • 而Mybatis的延迟加载是全局配置的。
2.4 缓存机制对比

相同点

  • Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。

不同点

  • Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。
  • MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

两者比较

  • 因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。
2.5 优势对比

两者相同点

  • Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
  • Hibernate和MyBatis都支持JDBC和JTA事务处理。

Mybatis优势

  • MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
  • MyBatis容易掌握,而Hibernate门槛较高。

Hibernate优势

  • Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
  • Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
  • Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
  • Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
2.6 优缺点对比

Hibernate的优点:

  • Hibernate是全自动,hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。
  • 功能强大,数据库无关性好,O/R映射能力强,需要写的代码很少,开发速度很快。
  • 有更好的二级缓存机制,可以使用第三方缓存。
  • 数据库移植性良好。
  • Hibernate拥有完整的日志系统,Hibernate日志系统非常健全,涉及广泛,包括sql记录、关系异常、优化警告、缓存提示、脏数据警告等

Hibernate的缺点:

  • 学习门槛高,精通门槛更高,程序员如何设计O/R映射,在性能和对象模型之间如何取得平衡,以及怎样用好Hibernate方面需要的经验和能力都很强才行。
  • Hibernate的SQL很多都是自动生成的,无法直接维护SQL;虽然有HQL查询,但功能还是不及SQL强大,见到报表等变态需求时,HQL查询要虚,也就是说HQL查询是有局限的;Hibernate虽然也支持原生SQL查询,但开发模式上却与orm不同,需要转换思维,因此使用上有些不方便。总之写SQL的灵活度上Hibernate不及Mybatis。

Mybatis的优点:

  • 易于上手和掌握,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美;
  • SQL写在xml里,便于统一管理和优化,解除SQL与程序代码的耦合;
  • 提供映射标签,支持对象与数据库的orm字段关系映射;
  • 提供对象关系映射标签,支持对象关系组建维护;
  • 提供xml标签,支持编写动态SQL;
  • 速度相对于Hibernate的速度较快

Mybatis的缺点:

  • 关联表多时,字段多的时候,SQL工作量很大;
  • SQL依赖于数据库,导致数据库移植性差;
  • 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载;
  • 对象关系映射标签和字段映射标签仅仅是对映射关系的描述,具体实现仍然依赖于SQL。
  • DAO层过于简单,对象组装的工作量较大。
  • 不支持级联更新、级联删除。
  • Mybatis的日志除了基本记录功能外,其它功能薄弱很多。
  • 编写动态SQL时,不方便调试,尤其逻辑复杂时。
  • 提供的写动态SQL的xml标签功能简单,编写动态SQL仍然受限,且可读性低。
2.7 一句话总结
  • Mybatis:小巧、方便、高效、简单、直接、半自动化
  • Hibernate:强大、方便、高效、复杂、间接、全自动化

3 Mybatis框架在操作数据库的8个步骤

  1. 读取Mybatis配置文件mybatis-config.xml: mybatis-config.xml作为Mybatis的全局配置文件,配置Mybatis的运行环境等信息,其中主要内容是获取数据库连接。
  2. 加载映射文件Mapper.xml: Mapper.xml文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载才能执行。mybatis-config.xml可以加载多个配置文件,每个配置文件对应数据库中的一张表。
  3. 构建会话工厂: 通过Mybatis的环境等配置信息构建会话工厂SqlSessionFactory。
  4. 创建SqlSession对象: 由会话工厂创建SqlSession对象,该对象中包含执行SQL的所有方法。
  5. Mybatis底层定义了一个Executor接口来操作数据库: 它会根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
  6. 在Executor接口的执行方法中,包含一个MappedStatement类型的参数,该参数对映射信息的封装,用于存储要映射的SQL语句的id、参数等: Mapper.xml文件中一个SQL对应一个MappedStatement对象,SQL的id即是MappedStatement的id。
  7. 输入参数映射: 执行方法时,MappedStatement对象会对用户执行SQL语句的输入参数进行定义(可以定义为Map、List类型、基本类型和POJO类型),Executor执行器会通过MappedStatement对象在执行SQL前,将输入的Java对象映射到SQL语句中。这里对输入参数的映射过程就类似于JDBC编程中对preparedStatement对象设置参数的过程。
  8. 输入结果映射: 在数据库中执行完SQL语句后,MappedStatement对象会对SQL执行输出的结果进行定义(可以定义为Map和List类型、基本类型、POJO类型),Executor执行器会通过MappedStatement对象在执行SQL语句后,将输出结果映射至Java对象中。这种将输出结果映射到Java对象的过程就类似于JDBC编程中对结果的解析处理过程。

4 Mybatis的核心对象

SqlSessionFactory:

  • 是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession对象。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例。
  • SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。如果我们多次地创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为了解决此问题,通常每一个数据库都会对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单例模式。

SqlSession:

  • 是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession对象包含了数据库中所有执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。
  • 每一个线程都应该有一个自己的SqlSession实例,并且该实例是不能被共享的。同时,SqlSession实例也是线程不安全的,因此其使用范围最好在一次请求或一个方法中,决不能将其放在一个类的静态字段、实例字段或任何类型的管理范围(如Servlet的HttpSession)中使用。使用完SqlSession对象之后,要及时关闭它,通常可以将其放在finally块中关闭。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 简介
  • 2 对比
    • 2.1 开发对比
      • 2.2 系统调优对比
        • 2.3 对象管理与抓取策略
          • 2.4 缓存机制对比
            • 2.5 优势对比
              • 2.6 优缺点对比
                • 2.7 一句话总结
                • 3 Mybatis框架在操作数据库的8个步骤
                • 4 Mybatis的核心对象
                相关产品与服务
                数据库
                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档