JPA vs Spring JdbcTemplate

aem*_*999 72 java spring jpa spring-jdbc jdbctemplate

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

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

Tim*_*per 130

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

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

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

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

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

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

  • 关于开发人员需要了解关系数据库,sql和事务的+1点.但是,JPA允许您将持久层视为由表支持的对象,而不仅仅是表. (3认同)

Jas*_*son 70

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


hvg*_*des 44

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

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

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

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

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

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

  • 结束语句为+1.它通常是jdbc与orm之间的决定,而不是特定于JPA与JdbcTemplate. (6认同)
  • 内存足迹呢?JdbcTemplate 和 Spring-Data-Jpa 之间有什么大的区别吗?(我猜是冬眠) (2认同)

ams*_*ams 30

在其他答案中没有提到它,但两者都可以使用.在我的应用程序中,我使用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); 
    }
}
Run Code Online (Sandbox Code Playgroud)

关于Spring的好处是从JPA异常到spring Dao异常层次结构的异常转换适用于JPA和jdbcTemplate.所以在有意义时使用JPA,在有意义时使用jdbcTemplate.

  • `getSomeReport()`中的行应该是`this.jdbcTemplate....`而不是`this.entityManager.......? (18认同)

小智 5

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

  • 美好的一天,你能澄清一下'hibernate jdbctemplate'是什么意思吗?Hibernate 和 Spring JDBCTemplate 的组合还是其他什么? (3认同)