Java и PostgreSQL: полное руководство по связке для реальных проектов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему Java и PostgreSQL — это идеальный дуэт?

Если вы когда-нибудь задумывались, какую базу данных выбрать для своего Java-проекта, вы наверняка слышали о PostgreSQL. Это не просто очередная реляционная СУБД — это мощный инструмент, который обожают разработчики за стабильность, поддержку сложных типов данных и отличную производительность. А Java — это язык, на котором написаны миллионы корпоративных приложений. Вместе они образуют связку, которая выдерживает нагрузки Netflix, Instagram и сотен других гигантов.

В этом руководстве я покажу вам, как соединить Java с PostgreSQL, выполнять базовые операции и не облажаться с производительностью. Мы пройдём путь от установки драйвера до сложных запросов. Поехали!

Шаг 1. Всё, что нужно для старта

Прежде чем писать код, давайте убедимся, что у вас есть всё необходимое. Вам понадобятся:

  • Java Development Kit (JDK) версии 11 или выше (я рекомендую 17 или 21 — они LTS).
  • PostgreSQL — скачайте последнюю версию с официального сайта.
  • Любая IDE — IntelliJ IDEA, Eclipse или даже простой блокнот (но лучше IDEA, она подсказывает синтаксис).
  • Драйвер JDBC для PostgreSQL. Это мост между Java и базой.

Драйвер можно скачать вручную с Maven Central или добавить через систему сборки. Я покажу оба способа.

Установка через Maven (рекомендую)

Если вы используете Maven, просто добавьте в pom.xml эту зависимость:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.7.1</version>
</dependency>

Для Gradle — строчка в build.gradle:

implementation 'org.postgresql:postgresql:42.7.1'

Готово. Теперь ваш проект знает, как общаться с PostgreSQL.

Шаг 2. Подключение к базе данных

Создадим простое приложение, которое подключается к PostgreSQL. Для начала создайте базу данных в pgAdmin или через командную строку:

CREATE DATABASE javaguide;

Теперь напишем Java-код. Вот минимальный пример подключения:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnector {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/javaguide";
        String user = "postgres";
        String password = "your_password";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            if (conn != null) {
                System.out.println("Подключение к PostgreSQL успешно!");
            } else {
                System.out.println("Не удалось подключиться");
            }
        } catch (SQLException e) {
            System.err.println("Ошибка подключения: " + e.getMessage());
        }
    }
}

Важно: Замените your_password на реальный пароль от вашего PostgreSQL. Никогда не храните пароли в коде — используйте переменные окружения или файлы конфигурации.

Шаг 3. CRUD-операции: создание таблицы и работа с данными

Теперь, когда подключение работает, давайте создадим таблицу и научимся добавлять, читать, обновлять и удалять данные. Это основа любого приложения.

Создание таблицы

Выполним SQL-запрос через Java. Создадим таблицу users:

String createTableSQL = """
    CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        email VARCHAR(100) UNIQUE NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
""";

try (Statement stmt = conn.createStatement()) {
    stmt.execute(createTableSQL);
    System.out.println("Таблица users создана");
}

Вставка данных (INSERT)

Используем PreparedStatement — это безопасно и защищает от SQL-инъекций:

String insertSQL = "INSERT INTO users (name, email) VALUES (?, ?)";

try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
    pstmt.setString(1, "Иван Петров");
    pstmt.setString(2, "ivan@example.com");
    int rows = pstmt.executeUpdate();
    System.out.println("Добавлено строк: " + rows);
}

Чтение данных (SELECT)

Получим всех пользователей из таблицы:

String selectSQL = "SELECT * FROM users";

try (Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(selectSQL)) {

    while (rs.next()) {
        int id = rs.getInt("id");
        String name = rs.getString("name");
        String email = rs.getString("email");
        Timestamp createdAt = rs.getTimestamp("created_at");

        System.out.printf("ID: %d, Имя: %s, Email: %s, Создан: %s%n",
                id, name, email, createdAt);
    }
}

Обновление и удаление

Обновим email пользователя:

String updateSQL = "UPDATE users SET email = ? WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(updateSQL)) {
    pstmt.setString(1, "newemail@example.com");
    pstmt.setInt(2, 1);
    int rows = pstmt.executeUpdate();
    System.out.println("Обновлено строк: " + rows);
}

Удалим пользователя:

String deleteSQL = "DELETE FROM users WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(deleteSQL)) {
    pstmt.setInt(1, 1);
    int rows = pstmt.executeUpdate();
    System.out.println("Удалено строк: " + rows);
}

Шаг 4. Продвинутые техники для профессионалов

Базовый CRUD — это круто, но в реальных проектах нужно больше. Давайте разберём несколько приёмов, которые сэкономят вам часы отладки.

Пул соединений (Connection Pool)

Создавать новое подключение каждый раз — дорого. Используйте пул соединений, например HikariCP. Добавьте в Maven:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.1.0</version>
</dependency>

Настройка пула:

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost:5432/javaguide");
config.setUsername("postgres");
config.setPassword("your_password");
config.setMaximumPoolSize(10);

HikariDataSource dataSource = new HikariDataSource(config);

// Теперь берём соединения так:
try (Connection conn = dataSource.getConnection()) {
    // ваш код
}

Пакетная вставка (Batch Insert)

Если нужно вставить 10 000 записей, не делайте это по одной. Используйте пакетную обработку:

String insertSQL = "INSERT INTO users (name, email) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prep                

Блоги

Рекомендаций по книгам