97

对于一个新项目,JPA 始终是处理关系数据的推荐工具,还是在某些情况下 Spring JdbcTemplate 是更好的选择?在您的回复中需要考虑的一些因素:

  • 新的数据库架构与预先存在的架构和表
  • 开发人员专业知识水平
  • 易于与数据缓存层集成
  • 表现
  • 还有其他需要考虑的相关因素吗?
4

5 回答 5

152

如果您不想通过域模型访问数据库模式,请使用 Spring JdbcTemplate。使用 JdbcTemplate 您正在使用较低级别的访问,具有更大的灵活性,但也可能更多样板。

Spring JdbcTemplate 可以更容易地与奇异的数据库模式和存储过程焦点一起使用。使用 JPA,您需要确保数据库模式正确映射到域模型。

这两种技术都需要开发人员了解关系数据库、SQL 和事务。但是,使用 JPA,您会获得更多隐藏的复杂性。

据我所知,JPA 更容易插入数据缓存层,因为面向对象的焦点使缓存条目识别、更新和失效更容易。

您可以更好地微调基于 JdbcTemplate 的后端,但在大多数情况下会涉及更多代码。

要考虑的其他一些方面是,尽管使用 JPA,您可以获得数据库模式的域模型,但您通常需要使用额外的 DTO 类。使用 JdbcTemplate 你可以直接操作 DTO 类。

于 2011-01-01T12:58:17.993 回答
88

我写这篇文章有点晚了,但我倾向于使用 JdbcTemplate 而不是 ORM。我知道 SQL(非常好)并且真的不想从我的数据库中“抽象”出来。我发现大多数时候,我的应用程序都在使用数据库视图,我将大部分业务逻辑推向了这些视图。我已经正确分层了具有 JdbcTemplate 实现的 DAO。感觉“干净”,大多数样板代码都被 JdbcTemplate 隐藏(它的在线文档似乎比 ORM 的东西好得多)。我使用 Hibernate 之类的东西的时间有限,我发现它何时工作,它为我节省了一些时间……但当它不能正常工作时,我花了几天的“WTF”调试时间。我从来不需要花费超过 20 分钟来调试 JdbcTemplate DAO 实现。正如其他人所说,我认为关键是您对 SQL / Schema Design 的熟悉程度

于 2011-07-27T01:49:35.827 回答
56

我同意@Timo。我要添加/扩展的唯一其他见解是 ORM 具有与纯 sql 访问数据不同的语义。

ORM 的重点是尽可能地抽象出您的数据在数据库中的事实。当您正确使用 ORM 时,所有持久性操作都在一个(希望如此)薄层中处理。您的模型对象将几乎没有持久性代码;您使用 ORM 的事实应该对您的模型不可见。

正因为如此,ORM 非常擅长让某些类型的操作变得轻松,即简单的 CRUD 操作。你可以很容易地加载你的模型对象,展示它们,更新它们,删除它们。它使您的生活更轻松,因为当您访问数据时,您会返回模型对象,您可以在其上编写业务逻辑。如果您使用 JDBC,您将不得不从数据中“水合”您的对象实例,这可能很复杂且容易出错。

ORM 并不总是最好的选择。JPA 是一项工作的工具,如果该工具不足以完成这项工作,您将希望找到一个更好的工具。例如,我有一个场景,我必须复制整个对象图并保存这些对象的新副本。如果我使用了 ORM(就像我尝试做的那样),我必须从数据库中加载所有对象,然后复制它们,然后保存新对象。我用的时间太长了。

更好的解决方案是简单地使用基于 jdbc 的操作和“通过选择插入”sql 调用来创建新行。它很快,代码更简单。

要考虑的另一件事是您对 JDBC 感到满意,并且有截止日期,您不必加入 ORM 潮流。Spring JdbcTemplate 类非常强大和有用。有时,完成这项工作的最佳工具就是您所知道的。您应该熟悉 ORM,但对于期望值很高的项目不一定要熟悉。有很多东西要学,而且不是微不足道的——实际上,在选择使用 jdbc 与 orm 时,您正在将一组复杂性与另一组复杂性进行交易。

于 2011-01-01T14:31:50.543 回答
41

其他答案中没有提到它,但两者都可以使用。在我的应用程序中,我使用 JPA 和 JdbcTemplate,对于 crud 类型的操作,我使用 JPA,但对于报告或更容易的地方,我使用 jdbcTemplate。

@Repository
public class FooRepository
{
    @PersistenceContext
    private EntityManager entityManager;

    @Autowired(required = true)
    private JdbcTemplate jdbcTemplate;

    public void saveFoo(Foo foo)
    {
         this.entityManager.persist(foo);
    }

    public List<SomeReportPojo> getSomeReport()
    {
         return this.jdbcTemplate.queryForList("SELECT .. ",SomeProjectPojo.class); 
    }
}

Spring 的伟大之处在于,从 JPA 异常到 Spring Dao 异常层次结构的异常转换适用于 JPA 和 jdbcTemplate。所以在有意义的时候使用 JPA,在有意义的时候使用 jdbcTemplate。

于 2012-12-14T22:57:22.233 回答
5

在工作中我们使用 Hibernate JDBCTemplate,因为它具有更大的灵活性。它还具有比 JPA 更好的性能,因为您不会将大量不必要的数据“加载”到您的应用程序中。
在 JDBCTemplate 案例中,您的 SQL 技能可以帮助您以正确的速度准确地提供您需要的东西。

于 2014-02-22T04:59:55.237 回答