2

我正在用java开发一个网络应用程序。我正在考虑使用 Spring MVC。但在 ORM 方面,我有一个决定要做。我研究过诸如 Hibernate、iBatis、Spring JDBC 模板等 ORM。

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

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

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

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

所以我的问题:

  1. 在 iBatis 和 Spring JDBC Template 之间使用哪一个?
  2. Hibernate 缓存(或我不知道的任何其他 Hibernate 功能)是否如此好,以至于我应该使用 Hibernate 而不是其他 ORM?
4

3 回答 3

6

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

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

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

于 2012-06-02T16:49:09.453 回答
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) 它具有任何持久性中最完整的特性集供应商在那里。

于 2012-06-02T17:01:16.483 回答
0

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

我是 myBatis 用户,相信它是一个中途并提供你需要的一切。好吧,myBatis 将是我个人对 Spring JDBC 模板的选择。

于 2012-06-02T16:58:38.710 回答