CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
PostgreSQL 实战/课时/Spring Boot 接入
RawBlame
课时目录12 节

PostgreSQL 实战

  1. 01PostgreSQL 是什么
  2. 02安装与 psql
  3. 03DDL 与约束
  4. 04数据类型
  5. 05JSONB
  6. 06索引与 EXPLAIN
  7. 07事务与 MVCC
  8. 08Spring Boot 接入
  9. 09迁移与 Flyway
  10. 10选型:PG vs MySQL
  11. 11Docker 运行 PG
  12. 12综合练习

Spring Boot 接入

JDBC URL、MyBatis-Flex/JPA 配置差异。

35 分钟

Spring Boot 接入 PostgreSQL

这一课你将能做到

  1. 在实验 profile 里配置 jdbc:postgresql://… 与驱动,启动时连上本地 codeforge_pg
  2. 用与本站类似的实体 / Mapper 风格完成一次按 slug 查询
  3. 列出换库时 schema、布尔、JSONB、分页四点注意,且不改动生产 MySQL 配置

为什么要学

只会 psql 不够:真实项目里 SQL 多半经 Spring Boot 发出。接入 PG 的关键是 JDBC URL + 驱动 + 方言细节;分层(Controller → Service → Mapper)可保持与本站 MySQL 版一致。

本站默认 mysql-connector-j 与 jdbc:mysql://…。本课用 独立 profile(如 pg-dev)做实验,避免误伤生产数据源。持久层示例按 MyBatis-Flex 风格(与仓库一致),也点到 JPA 方言一行配置。

先建立图像

application-pg-dev.yml
   url: jdbc:postgresql://127.0.0.1:5432/codeforge_pg
   driver: org.postgresql.Driver
            │
            ▼
      Hikari 连接池
            │
            ▼
   Mapper / JDBC   ──SQL──►  PostgreSQL
            │
            ▼
      实体 Track(Boolean、Long、String…)
项MySQL(本站)PostgreSQL(实验)
URL 前缀jdbc:mysql://jdbc:postgresql://
驱动com.mysql.cj.jdbc.Driverorg.postgresql.Driver
默认端口33065432
布尔常 TINYINT(1)BOOLEAN
分页LIMITLIMIT(Flex 可生成)

跟着做

步骤 1:加依赖(实验模块或 profile)

在练习用模块的 pom.xml 增加(版本由 Spring Boot BOM 管理时可省略 <version>):

<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <scope>runtime</scope>
</dependency>

不要删掉生产用的 MySQL 驱动;两套并存,靠 profile 选用。

步骤 2:写 application-pg-dev.yml

spring:
  datasource:
    url: jdbc:postgresql://127.0.0.1:5432/codeforge_pg?currentSchema=app
    username: codeforge
    password: ${DB_PASSWORD:devpass}
    driver-class-name: org.postgresql.Driver

currentSchema=app 让未加前缀的表名落到 app(若你的表在 app 下)。也可用 SQL 写 app.cf_track。

对照本站生产(勿改):

# 概念对照——保持 MySQL
# url: jdbc:mysql://localhost:3306/codeforge?...
# driver-class-name: com.mysql.cj.jdbc.Driver

步骤 3:确认库表已就绪

psql 中应有 app.cf_track(pg-ddl)。若空,插入至少一行。

步骤 4:实体与查询

@Data
@Table("cf_track")
public class Track {
    @Id(keyType = KeyType.Auto)
    private Long id;
    private String slug;
    private String title;
    /** 对应 PG BOOLEAN;勿用 Integer 硬扛 */
    private Boolean isMember;
}

Mapper 示例意图:

// SELECT id, slug, title, is_member
// FROM cf_track WHERE slug = ?
Track findBySlug(String slug);

用单元测试或临时 CommandLineRunner 打印结果。启动:

# 概念:激活实验 profile
java -jar your-app.jar --spring.profiles.active=pg-dev

应连上 PG;失败时看 URL、容器端口、schema。

步骤 5:JSONB 与类型处理(认知)

  • 简单做法:实体用 String 存 JSON 文本 + TypeHandler
  • 或 Map / 自定义处理器映射 JSONB
    先保证标量列跑通,再加 JSONB 字段,避免一次踩太多坑。

步骤 6:可选 JPA 方言

若用 JPA:

spring.jpa.database-platform: org.hibernate.dialect.PostgreSQLDialect

复杂报表仍建议 MyBatis 风格显式 SQL;CRUD 原型可用 JPA。

讲清楚要点

  1. 因为 驱动与协议不同,所以 换库不是改一个 host,而是 URL + 驱动 + SQL 方言。
  2. profile 隔离:pg-dev 只用于实验;默认 profile 继续 MySQL。
  3. schema 要显式:currentSchema 或限定名,避免表建在 public 却查 app。
  4. 自增映射:BIGSERIAL / IDENTITY 与 KeyType.Auto 需验证插入后回填 id。
  5. 布尔与时间:Boolean ↔ BOOLEAN;时间优先 timestamptz ↔ Instant/OffsetDateTime。
  6. 分页:LIMIT/OFFSET 两边都常见;注意深分页性能,与引擎无关的老问题。

你可能会懵的地方

  • 依赖加了仍说找不到驱动?
    看运行的是否真是该模块、profile 是否生效、是否打进运行时 classpath。

  • 表存在但 relation does not exist?
    search_path / currentSchema 不对。\dt app.* 核对。

  • MyBatis 关键字冲突?
    少数函数名差异用数据库厂商的 SQL 或抽象。先写简单 SELECT。

  • 能不能双数据源同时连 MySQL 与 PG?
    可以,但配置复杂,入门勿做。本课单数据源切换即可。

  • 生产切 PG 要改哪些?
    迁移脚本方言、类型、监控、备份;远不止 yml 一行。见选型课与迁移课。

错法对照

错法问题正解
直接改默认 application.yml 为 PG本站主线挂掉application-pg-dev.yml
URL 仍写 jdbc:mysql连错协议jdbc:postgresql://
布尔用 Integer 映射怪异转换Boolean
忽略 schema找不到表currentSchema=app 或限定名
未启动 Docker PG 就启 Spring连接拒绝先 docker ps 再启动应用

自测三问

  1. currentSchema=app 解决什么问题?还有哪种写法能达到类似效果?
  2. 为什么强调 profile 而不是覆盖生产数据源?
  3. PG BOOLEAN 在 Java 实体里更合理的类型是什么?

小结一句话

换驱动与 JDBC URL 即可让 Spring Boot 连上 PostgreSQL;用独立 profile 实验,分层与本站 MySQL 版保持同构。

官方延伸

  • PostgreSQL JDBC 文档
  • Spring Boot:Data Access
加载本节练习…
← 上一课事务与 MVCC下一课 →迁移与 Flyway