首页 > 解决方案 > Spring Boot + JDBC(不是 JPA)+ Postgres 入门?

问题描述

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

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

我相信我知道需要什么依赖项——基本上是 Postgres 和 Spring Data JDBC starter,两者都可用start.spring.io——就数据源属性而言,这个链接中的示例似乎可以工作......

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

但是我找不到如何声明存储库类,或者如何实例化或获取对所述存储库的引用。如果这些文档是为了解释这一点,恐怕他们的美德对我来说已经失去了。从他们链接到的示例中,看起来也许我可以创建这样的存储库...

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

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

@Autowired CategoryRepository repository;

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

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

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

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

非常感谢!

标签: postgresqlspring-bootspring-jdbc

解决方案


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

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

这似乎包含在Spring Boot 文档中,而不是 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用于连接字符串应用程序属性的前缀来注释您。DataSourceBuilder最简单的方法是在您的 Application 类中声明该方法。好消息是声明本身非常简单。

    @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)
  • 一个样板DataSource- 返回方法使用DataSourceBuilder(可能小心地获得prefix正确的属性)
  • 一个简单的@Autowired存储库字段

缺少表或实体类生成意味着更多的工作,但要知道的事情少了一件,我必须处理的惊喜来源也少了,所以我不介意权衡。

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


推荐阅读