Hibernate和iBATIS

73 java persistence frameworks hibernate ibatis

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

cle*_*tus 180

Ibatis和Hibernate是完全不同的野兽.

我倾向于看待它的方式是:如果您的视图更加以对象为中心, Hibernate的效果会更好.但是,如果您认为更加以数据库为中心,那么Ibatis是一个更强大的选择.

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

如果您正在处理需要编写相当复杂的SQL查询的"遗留"数据库模式,那么Ibatis可能会更好地工作.

HQL(Hibernate查询语言)是您必须学习的另一种语言,即使这样您也可能会发现需要编写SQL的情况.更重要的是,你可能会花一半时间找出XML,属性,注释等的正确组合,以使Hibernate生成一个高性能的SQL查询.

这个问题没有普遍的"A比B好"的答案.

  • 现在2年后,随着jpa的出现,这仍然是正确的,hibernate已经发生了很大变化,而ibatis现在是mybatis,我想知道当前人们的想法是什么. (18认同)
  • 你对mybatis有更明确的控制,因此工作更脏.但我个人喜欢mybatis. (2认同)
  • 从以数据为中心(又名 SQL)的角度理解应用程序的成本比从 ORM 的角度更清晰、更容易理解。请记住,如果它更容易理解,那么它总是更容易维护。另外,请注意,如果您沿着 ORM 路径走下去,您最终仍然必须广泛学习 SQL 和实体关系等。Cletus 关于“巨大复杂性”的评论是正确的。 (2认同)

Jos*_*ust 45

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

原因是你试图通常做两件事之一:

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

Hibernate适用于案例1,允许您创建POJO并持久/更新它.它也可以快速完成,除非您的域名非常大.

myBatis非常适合于您只想要答案的获取查询(案例2).Hibernate将尝试加载整个对象图,您需要使用LazyLoading技巧开始调优查询,以使其在大型域上运行.相反,如果您只是想要一些分析POJO页面,那么相同查询的myBatis实现将是微不足道的.

因此,myBatis SELECTS的Hibernate更快.

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

因此,请考虑这两种情况以及您的应用程序的作用.如果您有一个简单的域并且只是获取信息,请使用myBatis.如果您有一个复杂的域并持久化实体,请使用Hibernate.如果两者兼顾,请考虑采用混合方法.这就是我们在项目中使用的,它拥有数千个实体来控制它.;)


Pas*_*ent 18

Cletus在总结这一比较方面做得很好.当您控制数据模型时,Hibernate运行良好,并且更加以对象为中心,而当您需要与现有数据库集成并且更加以数据为中心时,iBATIS可以正常工作.

另外我认为Hibernate有更多的学习曲线.使用iBATIS,很容易知道正在发生什么,而Hibernate会发生更多"魔术".换句话说,新手可能会发现iBatis更易于使用和理解.

但我不是说你应该更喜欢iBatis,iBatis和Hibernate就像上面说的那样不同.

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


Jus*_*tas 15

ORM与持久性框架

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

数据库架构

Hibernate可以根据您的Java模型创建或验证数据库模式,而MyBatis没有此类功能.当您使用内存数据库时,它也便于测试环境.相关讨论:

高速缓存

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

乐观的锁管理

乐观锁管理也存在差异:

MyBatis本身不支持乐观并发控制,不像Hibernate/JPA这样的ORM工具和@Version注释.

相关讨论:

懒加载

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

Hibernate会话管理

保存,更新或删除等实体操作是通过Hibernate Session执行的.它需要很好地理解如何实现适当的Hibernate会话管理策略以避免detached entity passed to persist与Hibernate相关的其他现象.

有时,尝试理解底层Hibernate行为可能需要花费更多时间,而不是为myBatis添加更多工作和编写原始SQL语句.

级联

Hibernate为对象图提供了级联,孤立删除和其他功能,而它们不在myBatis中 - 为了实现它们,您需要明确地编写SQL查询.

查询

在myBatis中,您将编写几乎简单的SQL查询.Hibernate有多种形式的查询选项:SQL,HQL,Criteria API.有时,如果条件中有许多可选字段,则可能适合使用Criteria API.它将提供更加结构化的方法来形成查询,并可能避免相关的错误.


joh*_*hnm 8

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

Mybatis(最基本的级别)只是拼凑和执行存储在xml文件中的SQL的工具.它不会将Java对象的实例映射到数据库表中的行,而是将Java方法映射到SQL语句,因此它不是ORM.它当然也可以返回pojo,但它们并不依赖于任何类型的持久化上下文.

这两个工具比上面描述的要多得多,但一个是ORM,一个不是.

我相信,让您选择使用哪个标准的标准主要取决于您必须使用的数据库模型.

例如,想象一个庞大的蔓延模式,代表一些保险模型.开发人员需要检索数据,并以满足手头业务的方式与数据交互.

开发人员继续前进,并且永远不会期望拥有必要的业务知识来 手工编写所有 sql(Mybatis需要).Hibernate会适合这样的场景.

业务分析师定义数据模型,实体,关系和交互,以及他们的专业知识.然后,Java开发人员使用Hibernate来"走模型".业务开发人员可以快速提高工作效率,而无需编写复杂的容易出错的SQL来在非常复杂的模式上运行.

在我的expierence中,Hibernate和Mybatis都在同一个项目中定期使用.

使用Hibernate的地方

  • 一般CRUD功能
  • '走''域对象'关系模型
  • 会话管理

以及Mybatis的使用地点

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


duf*_*ymo 6

如果您已经在使用Spring,我将从Spring JDBC开始,而不是直接进入Hibernate或iBatis.如果你根据接口编写持久层,那么在你熟悉Hibernate或iBatis之后,切换实现应该没有问题.

没有理由为什么它必须是"全有或全无"的决定.使用最适合您情况的东西.

  • Spring JDBC远不如Ibatis.首先,您必须编写行映射器(繁琐)或Spring的bean映射速度非常慢.如果你在Spring MVC中绑定一个表单并不重要,但如果你要返回数千行,那肯定会有.我将查询的执行时间从50多秒减少到<2只是将Spring JDBC中的Spring映射替换为显式行映射器但是谁想编写那些? (8认同)

归档时间:

查看次数:

83844 次

最近记录:

7 年,1 月 前