本博客旨在概述MyBatis和Hibernate。在我们谈论MyBatis和Hibernate之前,最好先将对象关系映射作为一个概念 来讨论。
对象关系映射(ORM)是一种编程技术,它能够使用首选编程语言的面向对象范式(即,在关系数据库和面向对象的编程语言(如Java,.NET等)之间转换数据)编写简单和复杂的查询。
对象关系映射 (ORM) 是一种从面向对象的语言访问关系数据库的技术(设计模式),可帮助应用程序实现持久性。
那么什么是持久性呢?
持久性只是意味着我们希望应用程序的数据比应用程序进程更持久。在 Java 术语中,某些对象的状态位于 JVM 的范围之外,以便以后可以使用相同的状态。
Hibernate和MyBatis都与Spring框架兼容。
Hibernate是一个对象关系映射框架(ORM),它将Java类映射到数据库表,而MyBatis是一个持久性框架 - 而不是ORM,它将SQL语句映射到Java方法。
什么是Hibernate?
Hibernate是一种开源的轻量级ORM(对象关系映射)工具。
它是一个 Java 框架,通过将应用程序域对象映射到关系数据库表(反之亦然),简化了 Java 应用程序的开发,以与实现 JPA(Java 持久性 API)规范的数据持久性数据库进行交互。
Hibernate通常使用自定义查询语言,即休眠查询语言 (HQL) 或企业 JavaBeans 查询语言 (EJB QL)。
Hibernate具有以下设计理念:
- 轻量级 − Hibernate是一个轻量级框架,因为它不包含其他功能;它仅使用对象关系映射所需的那些功能。
- 开源 − Hibernate是开源软件,这意味着每个人都可以免费使用它。
- ORM(对象关系映射)− Hibernate是一个 ORM 工具,有助于 Java 类和关系数据库之间的交互。
- 高性能 − Hibernate支持许多不同的提取技术,例如缓存、延迟初始化等,以实现高性能。
- HQL(Hibernate查询语言)− Hibernate是一个轻量级框架,因为它不包含其他功能,并且仅使用对象关系映射所需的那些功能。
- 缓存 − 缓存是将数据存储到缓存内存中并提高数据访问速度的过程。Hibernate支持两级缓存,即第一级和第二级缓存。
- 自动生成 − Hibernate提供了自动生成表的功能。这意味着程序员不必担心查询实现,即Hibernate自己做。
- 可伸缩性 − Hibernate是高度可伸缩的,因为它可以适应任何环境。Hibernate既可用于小规模应用程序,也可用于大规模应用程序。
- 延迟加载 − Hibernate支持一个称为延迟加载的新概念。延迟加载概念检索执行的唯一必要对象。它还提高了应用程序的性能。
- 数据库独立 − Hibernate是独立于数据库的,因为它提供“数据库方言”,所以我们不需要编写SQL查询。它支持许多数据库,如Oracle,MySql,Sybase等。
什么是MyBatis?
MyBatis是一个开源、轻量级、持久的框架。
它是 JDBC 和Hibernate的替代方法。
它自动执行 SQL 数据库与 Java、.NET 等对象之间的映射。
MyBatis和其他持久性框架之间的显着区别在于,MyBatis强调使用SQL,而其他框架(如Hibernate)通常使用自定义查询语言(HQL / EJB QL)。
MyBatis是iBATIS 3.0的一个分支,由一个团队维护,该团队包括iBATIS的原始创建者。
MyBatis具有以下设计理念 -
- 开源 − MyBatis 是免费的开源软件。
- 支持 ORM − MyBatis 支持许多与 ORM 工具相同的功能,例如延迟加载、联接提取、缓存、运行时代码生成和继承。
- 简单性 − MyBatis被广泛认为是当今最简单的持久性框架之一。
- 快速开发 − MyBatis 尽其所能促进超快速开发。
- 可移植性 − MyBatis几乎可以用于任何语言或平台,例如适用于微软.NET的Java,Ruby和C#。
- 独立接口 − MyBatis 提供独立于数据库的接口,帮助应用程序其余部分的 API 独立于任何与持久性相关的资源。
- 存储过程 − MyBatis 以存储过程的形式封装 SQL,以便业务逻辑可以保留在数据库之外,并且应用程序更具可移植性,更易于部署和测试。
- 内联 SQL − 无需预编译器,您可以完全访问 SQL 的所有功能。
- 动态 SQL − MyBatis 提供了基于参数动态构建 SQL 查询的功能。
MyBatis 以SQL为中心。它可以帮助您调用 SQL 语句并将结果(表)映射到对象树。
主要的好处是它不是ORM。它不会将表映射到对象,因此不会遇到 ORM 阻抗不匹配。
在哪里使用Hibernate和MyBatis ?
Hibernate用于
- 常规 CRUD(创建、读取、更新和删除)功能。
- 环境由对象模型驱动,需要自动生成 SQL。
- 会话管理。
MyBatis用于
- 分析提取查询。
- 存储过程和动态 SQL。
- 支持复杂的搜索查询(其中搜索条件是动态的)和结果分页。
ORM 与持久性框架
Hibernate是一个对象关系映射框架 (ORM),它将 Java 类映射到数据库表。
MyBatis是一个持久性框架,而不是ORM。它将 SQL 语句映射到 Java 方法。
场景:
例如,考虑要更改域数据的命令和只想获取一些数据的响应。
- 创建/更新/删除一些复杂的域实体
- 运行分析提取查询(即求和/聚合查询)
Hibernate适用于选择查询(情况1),允许您只创建POJO并保留/更新它。它也可以快速执行此操作,除非您的域非常大。
MyBatis非常适合获取查询(案例2),您只需要一个答案。
Hibernate 将尝试加载整个对象图,并且您需要使用延迟加载技巧开始调整查询,以使其在大型域上正常工作。
相反,如果你只想要一些分析POJO页面,那么同一查询的MyBatis实现将是微不足道的。
正因为如此,在选择中,MyBatis比Hibernate 更快。
因此,考虑到这两种情况以及您的应用程序的作用,您可以得出结论,是否需要Hibernate 或MyBatis。
如果你有一个简单的域名,只是获取信息,使用MyBatis。
如果您有复杂的域和持久实体,请使用Hibernate 。如果两者都做,请考虑混合方法(即,数千个实体以控制它)。
总结
如上所述,如果您的关注点以对象为中心,则Hibernate效果更好。但是,如果您的关注点以数据库为中心,那么myBatis是一个更有力的选择。这两个工具的作用比上面描述的要多得多,但一个是ORM,一个不是。