Gymterview
junior

Как подключить PostgreSQL к Java/Spring приложению?

Подключение PostgreSQL к Java-приложению выполняется через JDBC-драйвер. Spring Boot автоматизирует конфигурацию, достаточно указать URL, пользователя и пароль в application.yml.

Подключение через JDBC

Пример
<!-- pom.xml -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.7.3</version>
</dependency>
Прямое подключение через JDBC
String url = "jdbc:postgresql://localhost:5432/bank_db";
String user = "app_user";
String password = "secret";

try (Connection conn = DriverManager.getConnection(url, user, password);
     PreparedStatement ps = conn.prepareStatement(
         "SELECT id, balance FROM accounts WHERE client_id = ?")) {

    ps.setLong(1, clientId);
    try (ResultSet rs = ps.executeQuery()) {
        while (rs.next()) {
            long id = rs.getLong("id");
            BigDecimal balance = rs.getBigDecimal("balance");
        }
    }
}

Подключение через Spring Boot

Пример
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/bank_db
    username: app_user
    password: ${DB_PASSWORD}
    driver-class-name: org.postgresql.Driver
  jpa:
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    hibernate:
      ddl-auto: validate
    properties:
      hibernate:
        default_schema: core

Работа с типами PostgreSQL через JDBC

Пример
// JSONB
PGobject jsonObject = new PGobject();
jsonObject.setType("jsonb");
jsonObject.setValue("{\"key\": \"value\"}");
ps.setObject(1, jsonObject);

// UUID
ps.setObject(1, UUID.randomUUID());

// Array
Array sqlArray = conn.createArrayOf("text", new String[]{"tag1", "tag2"});
ps.setArray(1, sqlArray);

Использование с JPA/Hibernate

Пример Entity с типами PostgreSQL
@Entity
@Table(name = "accounts", schema = "core")
public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "client_id", nullable = false)
    private Long clientId;

    @Column(precision = 15, scale = 2)
    private BigDecimal balance;

    @Column(name = "created_at", columnDefinition = "timestamptz")
    private OffsetDateTime createdAt;

    // Для JSONB необходим пользовательский тип или библиотека
    @Type(JsonBinaryType.class)
    @Column(columnDefinition = "jsonb")
    private Map<String, Object> metadata;
}
<!-- Для работы с JSONB через Hibernate -->
<dependency>
    <groupId>io.hypersistence</groupId>
    <artifactId>hypersistence-utils-hibernate-63</artifactId>
    <version>3.7.3</version>
</dependency>

На собеседовании: покажите знание нюансов: ddl-auto: validate (не create!) для production, PGobject для JSONB через JDBC, hypersistence-utils для JSONB через Hibernate. Упомяните, что OffsetDateTime маппится на timestamptz, а LocalDateTime — на timestamp (без зоны).