JPA与Spring JdbcTemplate [已关闭]

nafvub8i  于 2023-02-21  发布在  Spring
关注(0)|答案(5)|浏览(167)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

三年前关闭了。
Improve this question
对于一个新的项目,JPA是否总是推荐用于处理关系数据的工具,或者是否存在Spring JdbcTemplate是更好的选择的情况?在回答时需要考虑的一些因素:

  • 新数据库模式与预先存在的模式和表
  • 开发人员的专业水平
  • 可轻松与数据缓存层集成
  • 性能
  • 是否有其他相关因素需要考虑?
e0uiprwp

e0uiprwp1#

如果你不想通过域模型访问你的数据库模式,使用Spring JdbcTemplate。使用JdbcTemplate你使用的是一个较低级别的访问,有更多的灵活性,但可能也有更多的样板。
SpringJdbcTemplate可以更容易地与奇异的数据库模式和存储过程焦点一起使用,使用JPA您需要确保数据库模式正确地Map到域模型。
这两种技术都需要开发人员了解关系数据库、SQL和事务,但使用JPA会带来更多隐藏的复杂性。
据我所知,JPA更容易插入到数据缓存层,因为面向对象的焦点使得缓存条目的识别、更新和失效更容易。
您可以更好地微调基于JdbcTemplate的后端,但大多数情况下需要更多的代码。
需要考虑的其他方面是,尽管使用JPA可以获得数据库模式的域模型,但通常需要使用其他DTO类。使用JdbcTemplate可以直接操作DTO类。

koaltpgm

koaltpgm2#

我写这篇文章有点晚了,但是我倾向于使用JdbcTemplate而不是ORM。(非常好),而且真的不想被“抽象”出我的DB。我发现大多数时候,我的应用程序使用的是DB视图,我将大多数业务逻辑推到了DB视图上。2我对具有JdbcTemplate实现的DAO进行了适当的分层。3它感觉“干净”,而且大多数样板代码都被JdbcTemplate隐藏了(它的在线文档似乎比ORM的东西好得多)。我使用Hibernate之类的东西的时间有限,我发现当它工作时,它保存我一些时间...但当它不能正常工作时,它花费了我几天的“WTF”调试。我从来没有花超过20分钟调试JdbcTemplate DAO impls。我认为关键,正如其他人所指出的,您对SQL /模式设计的熟悉程度
2023年编辑--我已经很久没有发布这个最初的答案了。围绕ORM的工具已经走过了很长的路。Spring Data和JPA现在是标准的,并且有合理的默认值。我开始欣赏在编写SQL时有编译安全性。我不认为这是一个错误或正确的问题......它们都是你应该在工具带中拥有的工具

snvhrwxg

snvhrwxg3#

我同意@Timo的观点,我唯一要补充/扩展的另一个见解是,ORM与纯SQL访问数据有不同的语义。
ORM的要点是尽可能地抽象出数据在DB中的事实。当你正确地使用ORM时,所有的持久性操作都在一个薄层中处理(希望如此)。你的模型对象将几乎没有持久性代码;您正在使用ORM的事实应该对您的模型不可见。
正因为如此,ORM非常擅长于使您的生活对某些类型的操作变得容易,即简单的CRUD操作。您可以相当容易地加载您的模型对象,呈现它们,更新它们,删除它们。它使您的生活变得更容易,因为当您访问您的数据时,您会得到模型对象,您可以在其上编写业务逻辑。如果您使用JDBC,您将不得不从数据中“水合”对象示例,这可能会很复杂并且容易出错。
ORM并不总是最好的选择。JPA是一个工作工具,如果这个工具不足以完成你的工作,你会想要找到一个更好的工具。例如,我有一个场景,我必须复制一个完整的对象图,并保存这些对象的一个新副本。如果我使用ORM(就像我试着做的那样),我必须从DB中加载所有对象,然后复制它们,然后保存新对象。我花了太长的时间。
更好的解决方案是简单地使用基于JDBC的操作和“通过选择插入”sql调用来创建新行。它速度快,代码更简单。
另一件需要考虑的事情是,你对JDBC很熟悉,并且有截止日期,你不必跳上ORM的潮流。SpringJdbcTemplate类非常强大和有用。有时候,最好的工具是你所知道的。你应该熟悉ORM,但对于一个期望很高的项目来说并不一定。有很多东西要学,而且不是微不足道的--实际上,在选择使用JDBC和ORM时,你是在用一组复杂性和另一组复杂性进行交易。

kkbh8khc

kkbh8khc4#

在其他答案中没有提到,但两者都使用是可以的。在我的应用程序中,我使用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有意义时,分别使用JPA和jdbcTemplate。

z4iuyo4d

z4iuyo4d5#

在工作中,我们使用Hibernate JDBCTemplate是因为它有更大的灵活性,它也比JPA有更好的性能,因为你不会“加载”很多不必要的数据到你的应用程序中。
在JDBCTemplate的情况下,您的SQL技能在以正确的速度提供您所需要的东西方面有很大的帮助。

相关问题