myBatis与Hibernate相比有什么优势?[关闭]


33

我自己进行了一些研究,并了解了基本概念。但是,一些见解只能通过实际经验获得。

myBatis的优点是什么使得值得学习新的框架?
在什么情况下您会避免使用它?


3
我对两者都进行了测试,最终使用了Cayenne。
deadalnix

Answers:


38

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

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

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

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

myBatis非常适合获取查询(案例2),而您只需要一个答案。Hibernate会尝试加载整个对象图,您需要使用LazyLoading技巧开始优化查询,以使其在较大的域中正常工作。在运行甚至不返回实体对象的复杂分析查询时,这一点很重要。在这种情况下,Hibernate仅提供SqlQuery和bean变形器,并且具有BigDecimal之类的默认类型,而myBatis可以轻松映射到简单的POJO非实体。

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

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


2
Hibernate也适用于您的案例2。有关简单示例,请参见:mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge

3
“休眠将尝试加载整个对象图”这听起来像是配置错误。听起来“您需要使用LazyLoading技巧开始调优查询”听起来像您已将fetch = eager设置为某个位置。JPA具有实际上是SQL的JPQL,但已与Hibernate / JPA很好地集成。我认为它做得很好。在ORM正确配置为100%之前,人们通常会在生产环境中运行一年或更长时间。当我说这是一个配置错误时,我并没有把它最小化-使用这些工具进行配置确实非常耗时且棘手!
GlenPeterson

3
@GlenPeterson我并不是说不能驯服Hibernate,但是对于大多数人来说,除非您进行了优化,否则复杂的域实体将缓慢加载,除非进行了优化。对于大多数用户来说,使用myBatis进行复杂的分析查询更为简单,尽管使用ORM确实可以实现相同的目的。许多人的问题是,他们是否需要产品具有ORM的供应商独立性。
约瑟夫·拉斯特

10
Hibernate假装其下没有DB,而您只是将数据模型当作使用Java集合设计的那样对待。通常情况并非如此。在数据库级别上,数据表示形式可能会非常不同,尝试将其自动映射到Java集合不一定有任何意义。这就是为什么Hibernate是“泄漏抽象”的完美示例。MyBatis更加简单,易于理解,没有魔术,也可以..是的,有SQL对我来说是件好事,因为对基于SQL的数据库使用SQL并没有错。
Marcin

2
@Marcin大点。我在Hibernate中看到了集合仿真的太多问题。例如,一些代码调用myBag.size(),然后Hibernate尝试在对750K对象进行计数之前将它们加载到内存中。如果只需要SQL,请使用SQL。
Joseph Lust 2014年

19

MyBatis以SQL为中心。它会帮助您调用SQL语句并将结果(表)映射到对象树。

主要好处是它不是ORM。它不会将表映射到对象,因此不会遭受orm阻抗不匹配的情况。非常适合复杂数据库或旧数据库,或使用数据库功能(如存储过程,视图等)。

它非常简单易学,因此也适合低技能的团队,因为他们之间不需要休眠专家。

看看jpetstore 6 http://mybatis.org/spring/sample.html


2
那些“低技能团队”仍然需要了解SQL。
2012年

答案简洁明了,两个主要区别是:db中心+浅层学习曲线。但是我并不完全同意“非常适合复杂或遗留数据库”。当您对数据库设计有更多控制时,以数据库为中心的优势就变得更加明显。
DPM 2013年

5

由于问题涉及我的意见,这是我脑子里想的写它。

首先,它源自您原始问题的上下文。在其他情况下,我可以提出不同的建议。让我建议MyBatis的要点是:

...我们遇到了一些性能问题。

我们决定放弃休眠模式,转而使用普通的Jdbc以获得数据库性能。

在过去的项目之一中,出于您所描述的原因,我们的团队一直在考虑从Hibernate迁移。与您类似,我们将切换到JDBC,但是另一个项目的同事向我们推荐了MyBatis。团队决定尝试一下,同时在出现问题的情况下保留JDBC作为备用选项。

那时,我对MyBatis一无所知,但对JDBC有足够的经验,以确保它能完成这项工作。尽管如此,我还是强烈支持尝试MyBatis的想法,主要原因是根据我过去的经验,我们必须使用JDBC编写的样板代码简直令人生畏。

  • 公平地讲,我喜欢JDBC,因为它易于理解,可靠并且可以很好地控制数据库交互,但是为此付出的代价确实很高。每当我想起要用JDBC输入多少样板时,我的手指就会开始发酸。

无论如何,我们尝试了MyBatis,它按照广告宣传工作。这就是为什么我写了您要问的评论。

如果您希望我提供有关该技术的详细概述,或者以某种方式称赞它的优势-很抱歉,我不能这样做。如果可以的话-我已经将其写在您原来问题的单独答案中,而不是简短评论。我提到当时我对MyBatis一无所知-抱歉,我对此仍然了解甚少。从Hibernate过渡是由其他团队成员完成的,并且不会影响我一直在研究的代码。我只记得关键要点(基于我的评论),即1)MyBatis解决了我们在Hibernate中遇到的问题; 2)它没有引入自己的问题; 3)允许我们避免编写样板代码I期待如果我们切换到JDBC。就这样。


3

Hibernate以太多的魔术,意外的行为和巨大的学习曲线而闻名。还有其他一些框架,它们更加注重简单性,可以让您掌控一切。

myBatis是其中之一,我的项目MentaBean是另一个。我写了一篇有关它可能会有所帮助的博客文章


6
嗨,塞尔吉奥,欢迎您。我们的社区通常不愿公开宣传自己,我们要求您在回答中清楚地表明您的隶属关系。我已经对您的答案进行了编辑,以指出MentaBean是您正在参与的项目,并且您已经撰写了指向的博客文章,如果您不希望随意更改它,请保持您与MentaBean有关的某种披露。请阅读我们的常见问题解答中相关部分以获取更多详细信息。
扬尼斯2012年

嗨,Yannis。我去做。感谢您的注意。:)

-1

5年前,我使用Hibernate 3将Hibernate用于数据加载和数据转换项目,我认为它很棒。我正在做一个小型的电子商务应用程序,尝试使用Hibernate 4时,我感到非常失望。他们已经删除了这些工具,并将其紧密集成到IDE中。我尝试了MyBatis,一整夜都可以完成所有工作,并且很容易将其集成到应用程序中。我认为Hibernate变得过于肿,此时我将在Hibernate上使用EJB 3。


1
EJB 3和Hibernate如何比较?
2014年
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.