45

在我们的项目中,我们必须在 Spring JDBCTemplate 和 Hibernate 之间做出选择。

我想知道在性能、实现和设计方面哪个更好。如何?

4

4 回答 4

54

如果你尽你所能使这两种实现都非常快,那么 JDBC 模板可能会快一点,因为它没有 Hibernate 的开销。但它可能需要更多的时间和代码行来实现。

Hibernate 有它的学习曲线,你必须了解幕后发生的事情,何时使用投影而不是返回实体等。但是如果你掌握了它,你将获得更多的时间,并拥有比使用 JDBC 更简洁的代码基于的解决方案。

我想说,在 95% 的情况下,Hibernate 足够快,甚至比未优化的 JDBC 代码还要快。对于剩下的 5%,没有什么可以禁止您使用其他东西,例如 Spring-JDBC。两种解决方案并不相互排斥。

于 2012-08-03T07:46:05.227 回答
41

这取决于您的项目以及 Hibernate 模型与您的想法的匹配程度。速度/性能无关紧要:如果您无法完全理解 Hibernate 的工作原理,您的项目将充满奇怪的错误,需要很长时间才能找到和修复。

另请注意,Hibernate 的内部结构会泄漏到您的模型和 DAO 中。值得注意的冲突点通常equals()/hashCode()是事务之外的集合的延迟加载。由于 Hibernate 的示例非常简单,并且您可以在短时间内完成很多工作,这可能会导致人们误以为 Hibernate 很简单。它不是。Hibernate 做了很多假设,迫使你以某种方式思考和编码。

使用JdbcTemplate起来更容易,因为它只是 JDBC 本身的一个非常薄的包装器。这里的代价是你将编写数千行非常无聊的代码。此外,您会发现 SQL 字符串确实很难维护。当您的数据模型发生变化时,您将不得不在整个代码库中搜索所有可能受到影响的地方。不会很漂亮

对于我们自己的项目,我们决定不使用 Hibernate,因为我们有非常复杂的数据结构(修订后的树结构)并且必须在运行时构建复杂的搜索查询。相反,我们使用jOOQ编写了自己的 DAO 层。jOOQ 是一个围绕 JDBC 的瘦包装器,它允许您使用 Java 中的 DSL 编写 SQL:

create.selectFrom(BOOK)
      .where(PUBLISHED_IN.equal(2011))
      .orderBy(TITLE)

与 Hibernate 一样,jOOQ 也有一些你应该遵守的规则,否则你会不高兴,但这些规则要宽松得多。

作为另一种选择,您应该看看Spring Data。简而言之,Spring Data 允许您将数据存储到任何远程类似于数据库的东西中。这意味着您可以使用 Hibernate 和 NoSQL 数据库管理您的模型。或者,您可以根据需要轻松迁移模型的一部分。

关键特性之一是 DAO实现如下所示:

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

现在您可能想知道实现在哪里,因为这只是一个带有方法定义的接口,仅此而已。在运行时,Spring Data 将为您生成实现此方法的代码。这是可能的,因为您需要的所有查询中有 99% 的形式是“查询 X 列为 ... 的所有行的表”,因此他们优化了这个用例。

OTOH,如果您已经知道要在运行时构建非常复杂的搜索查询,那么 Spring Data 可能不会有太大帮助。

于 2012-08-03T08:39:29.313 回答
17

在我们的项目中,我们同时使用JdbcTemplateHibernate。您需要做的是在和DataSource之间共享。我们可以根据操作检查两者的性能,哪个更好,我们使用更好的一个。大多数情况下,我们将hibernate用于正常操作,如果有大查询或繁重的操作,我们会检查jdbc和hibernate的性能,无论我们使用哪个更好。hibernatejdbcTemplate

好处是HibernateTransactionManager适用于(JdbcTemplate,plain jdbc)和休眠。

于 2012-08-03T07:55:34.460 回答
0

你的数据库设计对hibernate友好吗?如果是,那么使用休眠......如果不是,那么你可能想要避免它。Jdbctemplate 有很多优点,并且有一些方法可以确保您的 SQL 查询易于维护。有一个包含所有这些的类或从文件中读取它们等。如果必须更新列,有一种方法可以使用标准 jdbc 来获取结果集元数据,从而允许您检索列名。这可能是复杂但有趣的解决问题的方法。Hibernate 是一个很棒的工具,但复杂的数据模型使它变得非常棘手。

于 2018-06-14T11:42:33.350 回答