JPA vs Spring JdbcTemplate

时间:2011-01-01 11:58:24

标签: java spring jpa jdbctemplate spring-jdbc

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

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

5 个答案:

答案 0 :(得分:113)

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

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

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

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

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

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

答案 1 :(得分:62)

我对这篇文章有点迟,但我倾向于在ORM上使用JdbcTemplate。我知道SQL(非常好)并且真的不想被“抽象”远离我的数据库。我发现大部分时间,我的应用程序都在使用数据库视图,我将大多数业务逻辑推向了最佳状态。我已经正确分层了具有JdbcTemplate实现的DAO。它感觉“干净”,大多数样板代码被JdbcTemplate隐藏(它的在线文档似乎比ORM的东西好多了)。有限的时间我使用了像Hibernate这样的东西,我发现当它工作时,它节省了一些时间......但是当它工作不正常时,它花了我几天的“WTF”调试。我从来没有花费超过20分钟调试JdbcTemplate DAO impls。我认为,正如其他人所说,关键是你对SQL / Schema Design的适应性

答案 2 :(得分:39)

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

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

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

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

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

要考虑的另一件事是你对JDBC感到满意,并且有最后期限,你不必跳过ORM的潮流。 Spring JdbcTemplate类非常强大且有用。有时,工作的最佳工具就是你所知道的工具。您应该熟悉ORM,但不一定是对具有高期望的项目。有很多东西需要学习,并且它不是微不足道的 - 实际上你在使用jdbc vs orm的选择中与另一组复杂交易。

答案 3 :(得分:28)

在其他答案中没有提到,但两者都可以使用。在我的应用程序中,我使用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.entityManager.queryForList("SELECT .. ",SomeProjectPojo.class); 
    }
}

Spring的优点是从JPA异常到Spring Dao异常层次结构的异常转换适用于JPA和jdbcTemplate。所以在有意义时使用JPA,在有意义时使用jdbcTemplate。

答案 4 :(得分:4)

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