在我们的项目中,我们必须在Spring JDBCTemplate和Hibernate之间做出决定。
我想知道在性能,实施和设计方面哪个更好。以及如何?
答案 0 :(得分:49)
如果您尽一切努力使两种实现都非常快,那么JDBC模板可能会更快一些,因为它没有Hibernate的开销。但它可能需要更多的时间和代码行来实现。
Hibernate有它的学习曲线,你必须了解幕后发生的事情,何时使用投影而不是返回实体等等。但是如果你掌握了它,你将获得更多的时间并且比代码更清晰,更简单。使用基于JDBC的解决方案。
我想说在95%的情况下,Hibernate足够快,甚至比非优化的JDBC代码更快。对于剩下的5%,没有什么禁止你使用别的东西,例如Spring-JDBC。两种解决方案都不是相互排斥的。
答案 1 :(得分:35)
这取决于您的项目以及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可能没那么大的帮助。
答案 2 :(得分:15)
在我们的项目中,我们同时使用JdbcTemplate
和Hibernate
。您需要做的是在DataSource
和hibernate
之间共享jdbcTemplate
。
我们可以根据操作检查两者的性能,无论哪个更好,我们使用更好的一个。大多数情况下,我们使用hibernate进行正常操作,如果有大量查询或繁重的操作,我们会检查jdbc和hibernate的性能,无论我们使用它们哪个更好。
好的一点是HibernateTransactionManager适用于(JdbcTemplate,普通jdbc)和hibernate。
答案 3 :(得分:0)
您的数据库设计是否适合hibernate?如果是,那么使用休眠...如果没有,那么你可能想避免它。 Jdbctemplate有许多优点,有很多方法可以确保您的SQL查询易于维护。有一个包含所有这些内容的类或从文件中读取它们等。如果必须更新列,则可以使用标准jdbc获取结果集元数据,以便检索列名。这可能很复杂,但却是解决问题的有趣方法。 Hibernate是一个很棒的工具,但复杂的数据模型使它变得非常棘手。