【问题标题】:Is it good idea to use the Dao design pattern with spring Boot, instead of using repository design pattern provided by spring data jpa?将 Dao 设计模式与 spring Boot 一起使用,而不是使用 spring data jpa 提供的存储库设计模式是个好主意吗?
【发布时间】:2017-05-14 22:59:31
【问题描述】:

实际上,我是 Spring Boot 的新手,但我使用 Spring 已经有一段时间了。在 spring 中,我曾经通过一个带有 hibernate/JPA 的通用 DAO 来处理我的数据库(MySQL)。但是我在spring Boot上找到的所有教程都使用spring data jpa制作,因此配置更容易。

因此,我想知道继续使用我的旧通用 DAO 是否是一个好主意,因为它允许我完全控制并根据需要自定义我的数据访问。如果是,我该如何进行?如果不是,可能有什么缺点?

【问题讨论】:

  • 关于新项目还是现有项目?存储库在两者上都可以正常工作,但它可能会影响答案..
  • 你试过spring data jpa了吗? Spring Boot 让它变得非常简单。制作使用 spring jdbc 的 daos 也很容易。在集成一些遗留的东西之前尝试使用 spring boot 方式。请说明完全控制对您意味着什么。不清楚您可以使用 spring data 或 spring jdbc 不会给您的通用 dao 进行什么控制。

标签: java spring hibernate spring-boot spring-data-jpa


【解决方案1】:

DAO 模式与 Spring Data 支持的存储库模式相同。至少,它应该是。每个实体都有一个 DAO(=Repository)类,提供查询或操作该实体的方法。

继续使用我的旧通用 DAO 是否是个好主意,因为 它使我可以完全控制并自定义我的数据 随意访问。

Spring Data 足够灵活,可以完全控制您的查询。您有以下选项(从 Spring Data 参考中复制的代码示例):

  • Using method names: 您可以简单地像这样命名您的存储库方法,让 Spring Data 自动为您生成查询:

    List<User> findByEmailAddressAndLastname(String emailAddress, String lastname); 
    
  • Using custom queries per annotation:@Query 注释中提供自定义 JPAQL 查询

    @Query("select u from User u where u.emailAddress = ?1")
    User findByEmailAddress(String emailAddress); 
    
  • Using named queries: 在 xml 文件中定义一个命名的 JPAQL 查询并在 @Query 注释中引用它

    <named-query name="User.findByLastname">
      <query>select u from User u where u.lastname = ?1</query>
    </named-query>
    
    @Query(name="User.findbyLastname")
    List<User> findByLastname(String lastname);
    
  • Implement a repository method yourself: 通过自己访问 Hibernate 会话(或其他 JPA 提供者的会话)来提供 Spring Data 存储库的部分实现。

所以,回答您的问题:是的,使用 Spring Data JPA,尤其是在新项目上!它为您做了很多工作,您仍然可以根据需要控制查询(这仅对复杂查询是必需的,即使对于那些我建议使用程序化 Specifications 的查询)。

【讨论】:

    【解决方案2】:

    Spring Data JPA 将使您作为开发人员的生活更轻松。 DAO 模式与存储库模式非常相似。使用 Spring Data JPA 的优势在于您将编写更少的代码。 Spring Data JPA 的工作方式与 Spring 集成网关很相似,您可以在其中定义一个接口,而 Spring 在运行时提供实现。

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 2012-03-28
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      相关资源
      最近更新 更多