postgresql - 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 连接信息开始,并且我知道我希望我的实体看起来像什么......
- 如何在属性中捕获我的 Postgres 连接信息?(我怀疑我上面的属性示例是正确的,但这只是从某个链接复制/粘贴)
- 我如何编写表然后生成实体类,或者相反?我更喜欢前者,但在这一点上我会满足于任何一个。
- 如何获取对我的 Postgres 数据库的 DataSource 的引用?(我可能永远不需要,但我想知道以防万一)
- 如何定义存储库类?(如果我对 CrudRepo 感到满意,我相信我会扩展
CrudRepository<AggRoot, IdType>
,但我对此很模糊) - 如何使用我的 postgres 信息/数据源实例化我的 repo 类?
- 我如何获得对这个 repo 的引用?
我敢肯定,如果我使用基本的 Spring 更强大,这会更容易,但我正在学习这一点。
非常感谢!
豆
解决方案
我拼凑了来自各种来源的一些工作代码并复制/粘贴。它不像是一个答案,更像是现在可以工作的代码,我愿意接受任何建议、更正或改进。
- 如何在属性中捕获我的 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
存储库字段
缺少表或实体类生成意味着更多的工作,但要知道的事情少了一件,我必须处理的惊喜来源也少了,所以我不介意权衡。
如果有人可以更正上述内容,或者指出明确的参考而不是对博客文章的模糊记忆,请随意。
推荐阅读
- mongodb - 仅从对象 mongoose 数组返回匹配项
- sql - Postgres的双引号问题
- docker - “docker login registry.domain.com”的问题
- c# - c# 四舍五入到小数点后两位
- mongodb - 是否有可能在 Mongodb(使用 mongoose 和 typegoose)中有一个嵌套键数组的索引?
- swift - LazyVGrid、List、LazyStacks 不会从内存中释放视图?
- flutter - Flutter:谷歌登录导致屏幕出现黑线
- c++ - 初始化 std::memset
- c++ - 如何使用 .pro 文件为 QT qmake + g++ 构建添加 c++ 构建标志?
- forms - Microsoft Access 组合框箭头隐藏的矩形再次出现