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(без зоны).