【问题标题】:Spring Boot + JDBC (not JPA) + Postgres Getting Started?Spring Boot + JDBC(不是 JPA)+ Postgres 入门?
【发布时间】:2021-06-12 04:57:03
【问题描述】:

尽我所能,我似乎找不到一个简单的 SpringBoot 应用程序示例,它使用 Spring Data JDBC 和 Postgres 数据库,或者如何从数据库生成实体类,或者如果需要,反之亦然,甚至如何获取对数据源的引用。

有很多使用 JPA 的示例。 有几个例子可以即时启动 H2/HSQL。 有几个在 Spring 中使用 Postgres 而不是 Spring Boot,这意味着这些示例有许多额外的步骤。

我相信我知道需要哪些依赖项——基本上是 Postgres 和 Spring Data JDBC 启动器,两者都在 start.spring.io 中提供——就数据源属性而言,this link 中的示例似乎可以工作。 ..

spring.datasource.url=jdbc:postgresql://localhost:5432/shopme
spring.datasource.username=postgres
spring.datasource.password=password

但我找不到如何声明存储库类,或如何实例化或获取对所述存储库的引用。如果the docs 是为了解释这一点,恐怕他们的美德在我身上丢失了。从the examples they link to,看来我可以创建一个这样的存储库...

interface CategoryRepository extends CrudRepository<Category, Long>, WithInsert<Category> {}

...然后像这样获取对我的存储库实现的引用...

@Autowired CategoryRepository repository;

...我想这会以某种方式使用我来自application.properties 的 Postgres 信息。

这些都没有解决表模式 => POJO 生成(反之亦然)。但即使我对上述内容是正确的,这也是我的持久层。我不习惯从一些示例代码中复制/粘贴,得到一个好的结果(现在),然后宣布它完成了。我宁愿根据真实信息工作。

如果我从有效的 Postgres 连接信息开始,并且我知道我希望我的实体看起来像什么......

  • 如何在属性中捕获我的 Postgres 连接信息? (我怀疑我上面的属性示例是正确的,但这只是从某个链接复制/粘贴)
  • 如何编写表然后生成实体类,或者相反?我更喜欢前者,但现在我会满足于任何一个。
  • 如何获取对我的 Postgres 数据库的 DataSource 的引用? (我可能永远不需要,但我想知道如何做)
  • 如何定义存储库类? (如果我对 CrudRepo 感到满意,我相信我会扩展 CrudRepository<AggRoot, IdType>,但我对此很模糊)
  • 如何使用我的 postgres 信息/数据源实例化我的 repo 类?
  • 如何获得对这个 repo 的引用?

我敢肯定,如果我在基本 Spring 方面更强大,这会更容易,但我正在学习这一点。

非常感谢!

豆子

【问题讨论】:

    标签: postgresql spring-boot spring-jdbc


    【解决方案1】:

    我从各种来源拼凑了一些工作代码并复制/粘贴。它不像是一个答案,更像是现在可以工作的代码,我愿意接受任何建议、更正或改进。

    • 如何在属性中捕获我的 Postgres 连接信息?

    这似乎包含在 Spring Boot docs 中,而不是 Spring Data 等。属性名称有很多容易被忽视的问题,这与 Spring Data 默认连接池更改(Tomcat 到 Hikari)有关,这需要对属性名称进行细微的更改:x.y.url= 更改为 x.y.jdbc-url=。所以我的属性看起来像这样:

    app.datasource.jdbc-url=jdbc:postgresql://localhost:5432/mydb
    app.datasource.username=admin
    app.datasource.password=admin
    
    • 如何编写表然后生成实体类,或者相反?我更喜欢前者,但现在我会满足于任何一个。

    据我所知,在 Spring Data JDBC 中你也不能这样做。我要说的只是我在 2019 年的一篇博文中读到的内容……我喜欢某种确定的东西。

    • 如何获取对我的 Postgres 数据库的 DataSource 的引用? (我可能永远不需要,但我想知道如何做)

    使用微妙记录的DataSourceBuilder 似乎是要走的路。更巧妙地记录是需要使用您用于连接字符串应用程序属性的前缀来注释您的DataSourceBuilder。最简单的方法是在 Application 类中声明 DataSourceBuilder 方法。好消息是声明本身非常简单。

        @Bean
        @ConfigurationProperties(prefix = "app.datasource")
        public DataSource dataSource ()
        {
            return DataSourceBuilder.create().build();
        }
    
    • 如何定义存储库类? (如果我对 CrudRepo 感到满意,我相信我会扩展 CrudRepository<AggRoot, IdType>,但我对此很模糊)

    确实,CrudRepository 是要走的路。我发现的许多示例都具有误导性的复杂性:它们添加注释是因为它们在执行非默认操作,但如果您只想要 CRUD,这就是您所需要的:

    @Repository // I'm unsure if this is needed - some examples had it, some didn't
    public interface MyAggRootRepository extends CrudRepository<MyAggRoot, Long>
    {
    }
    
    • 如何使用我的 postgres 信息/数据源实例化我的 repo 类?
    • 如何获得对这个 repo 的引用?

    使用如上正确编码的DataSourceBuilder,您只需为您的存储库声明一个@Autowired 字段即可。

        @Autowired
        MyAggRootRepository _repo
    

    这似乎就是一切。一旦你知道了这些步骤,那就没什么了:

    • application.properties 中的几行
    • 一个非常简单的接口扩展CrudRepository(T, PK)
    • 使用DataSourceBuilder 的样板DataSource-returning 方法(可能要注意在属性上正确获取prefix
    • 一个简单的@Autowired 存储库字段

    没有表或实体类生成意味着更多的工作,但它需要知道的东西少了,我必须处理的意外来源也少了,所以我不介意权衡。

    如果有人可以更正上述内容,或者指出明确的参考资料而不是对博客文章的模糊记忆,请随意。

    【讨论】:

      【解决方案2】:

      我刚刚上传了一个使用 Spring Data JPA here on my Github 的基本示例(对不起,在 application.properties 上写了很多行,如果不需要,请忽略)

      当你使用 spring-boot-starter-data-jpa 依赖时。它将为您设置与数据库相关的任何内容。您不需要放置任何样板代码。

      你可以使用注解@Repository,这取决于你的代码结构和需求。对我来说,我总是使用注解。

      如果您使用的是 Eclipse,则可以使用“从表中生成实体”向导。指定连接器或驱动程序,填写数据库凭据即可开始使用。

      【讨论】:

      • 这只是一个依赖。基本上,实现 CrudRepository 的方式是类似的。您也可以将 CrudRepository 与 JPQL 或本机查询一起使用。另一件事,您可以考虑使用 JdbcTemplate。它是 JDBC 核心包中的中心类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 2017-12-23
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      相关资源
      最近更新 更多