Hibernate、iBatis、Spring JDBC Template,该用哪一个? [关闭]

Posted

技术标签:

【中文标题】Hibernate、iBatis、Spring JDBC Template,该用哪一个? [关闭]【英文标题】:Hibernate, iBatis, Spring JDBC Template, which one to use? [closed] 【发布时间】:2012-06-02 13:30:59 【问题描述】:

我正在用 Java 开发一个 Web 应用程序。我正在考虑使用 Spring MVC。但在 ORM 方面,我有一个决定要做。我研究过 Hibernate、iBatis、Spring JDBC Template 等 ORM。

我发现 iBatis 和 Spring JDBC 模板(使用 RowMapper)几乎相同,您将每个查询映射到一个对象。所以你必须为每个查询编写一个类。

在 Hibernate 中,您将每个表映射到一个类。它减少了编写 SQL 的需要。

我想当你不擅长 SQL 时,Hibernate 更可取。在我的情况下,我对 SQL 很熟悉,所以想使用 iBatis 或 Spring JDBC 模板,它们可以让我很好地控制 SQL,而且这些都没有那么复杂休眠。

但是 Hibernate 提供了其他 ORM 不提供的缓存。

所以我的问题:

    在 iBatis 和 Spring JDBC 模板之间使用哪一个? Hibernate 缓存(或任何其他我不知道的 Hibernate 功能)是否非常好,以至于我应该使用 Hibernate 而不是其他 ORM?

【问题讨论】:

缓存可以独立于ORM技术。 【参考方案1】:

我猜当你不擅长 SQL 时,Hibernate 更可取

我不同意您应该使用 Hibernate 或任何其他 ORM 的想法,因为您不太擅长 SQL。

虽然 Hibernate 确实会为您生成 SQL,但不了解它在做什么会导致性能灾难。

【讨论】:

【参考方案2】:

作为一名 Hibernate 开发人员,我也非常擅长 SQL ;) 事实上,我职业生涯的开始是专门研究关系(甚至是一些前关系)数据库。无论如何,我真的不明白手写 SQL 是“更易于维护”或提供“更好的控制”的误解。但是,如果您确实接受了这种误解,那么您实际上可以告诉 Hibernate 您希望它用于与每个实体相关的所有 CRUD 操作的 SQL(请参阅@SQLInsert@SQLUpdate 等)。

再次,我发现这几乎不是可维护的。就个人而言,我宁愿让 Hibernate 为我管理 INSERT/UPDATE/DELETE SQL。另一方面,加载数据是我通常需要更多控制的情况。但是 Hibernate(以及一般的 JPA 提供者)已经通过 HQL/JPQL 和 Criteria 查询为您提供了这种控制。在我看来,如果你依赖 Session.get 你只是在要求糟糕的表现。这与使用 O/RM 无关。这不是一个好的数据加载计划,因为您需要的数据量(甚至与同一实体相关)根据应用程序用例而有所不同。例如,为下拉列表加载员工需要的数据量与生成部门名册的数据量大不相同。这就是控制。

请务必使用您觉得最舒服的方式并满足应用程序的目标/要求。只需确保您在技术和产品之间的比较点是真实的,而不仅仅是误解。

就 O/RM 而言,缓存是一个公平的观点。事实上,JPA(从 2.0 开始)需要某种程度的缓存。但是,请注意,在 O/RM 级别进行缓存通常会导致性能下降。您确实需要了解要缓存的特定数据的语义。有些数据适合缓存,有些则不是。此外,缓存“高于”O/RM 级别通常要好得多。

就我个人而言,我会选择 Hibernate,因为我相信 (1) 它在抽象之间取得了最佳平衡,同时仍然可以访问 SQL 功能(这在很大程度上适用于 JPA 提供程序)和 (2) 它具有最完整的功能集任何持久性提供程序。

【讨论】:

优秀的积分!只是想分享几年前 Gaven King 的一次采访,他谈到了这些观点 - javaperformancetuning.com/news/interview041.shtml【参考方案3】:

嗯,您的选择应该取决于您开发应用程序的目的。我会说 Hibernate 是上述 ORM 中更强大的,并且拥有强大的社区和缓存非常强大。但真正强大的缓存有时会成为问题,而且会占用大量内存。

我是 myBatis 用户,相信它是一种中间方式,可以满足您的所有需求。好吧,myBatis 将是我个人对 Spring JDBC 模板的选择。

【讨论】:

以上是关于Hibernate、iBatis、Spring JDBC Template,该用哪一个? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

spring+ibatis环境搭建

休眠与 iBATIS [关闭]

对SSH三大框架的理解

spring集成ibatis进行项目中dao层基类封装

activiti5 为啥选择 ibatis

Hibernate与Ibatis比较