休眠与iBATIS的比较


78

为了重新设计新产品,我们正在从Java中选择最佳框架。由于考虑使用模型的数据库不可知方法,因此我们正在研究iBATIS或Hibernate在Struts + Spring之间的选项。请提出建议,因为两者都可以提供持久性。

Answers:


190

iBATIS和Hibernate是完全不同的野兽。

我倾向于这样看:如果您的视图以对象为中心,则Hibernate会更好地工作。但是,如果您认为以数据库为中心,那么iBATIS是一个更强的选择。

如果您完全控制模式,并且对吞吐量没有很高的要求,那么Hibernate可以很好地工作。对象模型使得用于还算方便代码,但在巨大的复杂性成本。

如果您要处理“传统”数据库架构,需要编写相当复杂的SQL查询,那么iBATIS可能会更好地工作。

HQL(休眠查询语言)是您必须学习的另一种语言,即使那样,您可能仍会发现仍然需要编写SQL的情况。而且,您有机会花半天的时间弄清楚XML,属性,注释等的正确组合,以使Hibernate生成高性能的SQL查询。

对于此问题,没有通用的“ A优于B”答案。


对于带有SQL构建器的轻量级微型ORM,请检查MentaBean:mentabean.soliveirajr.com
TraderJoeChicago 2011年

20
现在2年后,随着jpa的问世仍然如此,冬眠已经发生了很大的变化,ibatis现在变成了mybatis,我想知道人们现在的想法是什么。
Joelio

但是,最好考虑使用Hibernatate,EclipseLink,Toplink等JPA2.0兼容JPA提供程序之一进行新的Web应用程序开发。正如Cletus指出的那样,iBatis也很好。
Sree Rama

2
您可以更清楚地控制mybatis,从而使工作更加肮脏。但是我个人喜欢mybatis。
Eric Wang

@cletus还是真的吗?
Suganthan Madhavan Pillai

51

考虑一下您要实现的目标。通常,命令查询响应隔离 模型适用于复杂域。

原因是您通常尝试执行以下两项操作之一:

  1. 创建/更新/删除一些复杂的域实体
  2. 运行分析提取查询(即求和/汇总查询)

Hibernate在第一种情况下效果很好,允许您仅创建一个POJO并保持/更新它。除非您的域很大,否则它也会快速执行此操作。

myBatis非常适合只需要答案的提取查询(案例2)。Hibernate会尝试加载整个对象图,您需要使用LazyLoading技巧开始优化查询,以使其在较大的域中正常工作。相反,如果您只想要一些分析POJO页面,则同一查询的myBatis实现将是微不足道的。

因此,在SELECTS上,myBatis比Hibernate快。

这两种情况的区别命令要更改域数据和反应,你只是想获取一些数据。

因此,请考虑这两种情况以及您的应用程序所执行的操作。如果您有一个简单的域并且仅获取信息,请使用myBatis。如果您有一个复杂的域并保留了实体,请使用Hibernate。如果两者都做,请考虑使用混合方法。这就是我们在具有成千上万个实体的项目中使用的东西,以使其受到控制。;)


22

ORM与持久性框架

Hibernate是对象关系映射框架(ORM),它将Java类映射到数据库表。MyBatis是持久性框架-不是ORM。它将SQL语句映射到Java方法。

数据库架构

Hibernate可以根据您的Java模型创建或验证数据库模式,而MyBatis不具有此功能。当您使用内存数据库时,这对于测试环境也很方便。相关讨论:

快取

Hibernate具有无法禁用的一级缓存。这意味着,如果您通过ORM查询项目,然后直接使用SQL将其删除,则该项目将保留在缓存中。您可以显式清除缓存,以从数据库中获取最新的结果。相关讨论:

乐观锁管理

乐观锁管理也存在差异:

MyBatis本身不支持开放式并发控制,与带有@Version批注的Hibernate / JPA之类的ORM工具不同。

相关讨论:

延迟加载

Hibernate将尝试加载整个对象图,但标记为延迟加载的对象除外。myBatis将根据SQL查询加载数据。延迟加载可以提高性能,但是如果与<property name="hibernate.enable_lazy_load_no_trans" value="true" /> 属性一起使用,则可能导致连接泄漏 。相关讨论:

休眠会话管理

诸如保存,更新或删除之类的实体操作是通过Hibernate Session执行的。它需要充分了解如何实施适当的Hibernate Session管理策略,以避免detached entity passed to persist与Hibernate相关的其他现象。

有时,要了解基本的Hibernate行为可能要花费更多的时间,而不是增加一些工作并为myBatis编写原始SQL语句。

级联

当对象图不存在于myBatis中时,Hibernate为对象图提供了级联,孤立删除和其他功能-要实现它们,您需要显式编写SQL查询。

查询

在myBatis中,您将编写几乎普通的SQL查询。Hibernate具有多种形式查询的选项:SQL,HQL,Criteria API。有时,当条件中包含许多可选字段时,使用Criteria API可能是合适的。它将提供更结构化的方法来进行表单查询,并可能避免相关的错误。


18

Cletus在总结此比较方面做得很好。当您控制数据模型时,Hibernate效果很好,并且以对象为中心,而当您需要与现有数据库集成时,iBATIS效果也更好,并且以数据为中心。

我也认为Hibernate有更多的学习曲线。使用iBATIS,很容易知道发生了什么,而Hibernate发生了更多的“魔术”。换句话说,新手可能会发现iBatis更易于使用和理解。

但是我并不是说您应该选择iBatis,iBatis和Hibernate只是如上所述。

顺便说一句,如果您选择使用Hibernate,则可以考虑使用Hibernate Annotations提供的标准化JPA和EJB 3.0(JSR-220)对象/关系映射注释。


8

Hibernate是一个ORM,意味着(在最基本的水平上)它将Java对象的实例映射到数据库表中的实际行。通常,对于通过Hibernate检索的pojo:对这些pojo的任何操纵和修改都将出现在数据库中。Hibernate将在适当的时候生成并执行相关的SQL。

Mybatis(在最基本的级别上)只是一个用于拼合和执行存储在xml文件中的SQL的工具。它不会将Java对象的实例映射到数据库表中的行,而是将Java方法映射到SQL语句,因此它不是ORM。当然,它也可以返回pojo的内容,但是它们并不与任何持久性上下文相关。

两种工具的功能远不止上述,但是一个是ORM,一个不是。

我认为,使您能够选择使用哪种标准的标准在很大程度上取决于您必须使用的数据库模型。

例如,假设有一个庞大的架构,表示某种保险模型。开发人员需要检索数据,并以符合手头业务的方式与该数据进行交互。

开发人员不断发展,永远不会期望拥有必要的业务知识来 手工编写所有sql(Mybatis会需要)。Hibernate适合这样的情况。

业务分析师及其专业知识定义了数据模型,实体,关系和交互。然后,Java开发人员使用Hibernate来“遍历模型”。业务开发人员无需编写复杂的易于出错的sql即可在非常复杂的架构上运行,就可以迅速提高生产力。

以我的经验,Hibernate和Mybatis经常用于同一项目。

使用Hibernate的地方

  • 通用CRUD功能
  • “行走”“域对象”关系模型
  • 会话管理

以及Mybatis的用途

  • 临时查询
  • 启动(并与之交互)存储过程
  • 支持非常具体或复杂的查询
  • 支持复杂的搜索查询,其中搜索条件是动态的,并且可以分页结果

6

如果您已经在使用Spring,那么我将从Spring JDBC开始,而不是直接进入Hibernate或iBatis。如果您按照接口来编写持久层,那么在将Hibernate或iBatis投入使用后,切换实现应该没有问题。

没有理由必须做出“全有或全无”的决定。使用最适合自己的情况。


8
Spring JDBC远远不如Ibatis。一方面,您必须编写行映射器(繁琐),否则Spring的bean映射会非常慢。如果要在Spring MVC中绑定表单,那没关系,但是如果要返回数千行,那也可以。我只用显式的行映射器替换了Spring JDBC中的Spring Bean映射,就将查询的执行时间从50多秒减少到了<2,但是谁想写那些呢?
cletus 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.