Работа с базами данных в Java: PostgreSQL и MongoDB на практике

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

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

Начать курс

Введение: зачем Java-разработчику знать PostgreSQL и MongoDB?

Современная Java-разработка редко обходится без взаимодействия с базами данных. Две самые популярные системы — реляционная PostgreSQL и документо-ориентированная MongoDB — покрывают 90% задач enterprise-приложений. PostgreSQL идеально подходит для строгих схем и транзакционных систем, а MongoDB — для гибких структур данных и высоких нагрузок на запись.

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

1. PostgreSQL в Java: классика реляционных баз

1.1. Подключение и настройка

Для работы с PostgreSQL в Java используется драйвер org.postgresql:postgresql. Добавьте зависимость в pom.xml (Maven):

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

Подключение через JDBC выглядит так:

String url = "jdbc:postgresql://localhost:5432/mydb";
String user = "postgres";
String password = "secret";

try (Connection conn = DriverManager.getConnection(url, user, password)) {
    System.out.println("Соединение с PostgreSQL установлено!");
} catch (SQLException e) {
    e.printStackTrace();
}

1.2. CRUD-операции на практике

Создадим таблицу users и выполним базовые операции:

// Создание таблицы
String createSQL = """
    CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        name VARCHAR(100),
        email VARCHAR(100) UNIQUE,
        age INTEGER
    )
""";

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

// INSERT
String insertSQL = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
    pstmt.setString(1, "Иван Петров");
    pstmt.setString(2, "ivan@example.com");
    pstmt.setInt(3, 30);
    pstmt.executeUpdate();
}

// SELECT
String selectSQL = "SELECT * FROM users WHERE age > ?";
try (PreparedStatement pstmt = conn.prepareStatement(selectSQL)) {
    pstmt.setInt(1, 25);
    ResultSet rs = pstmt.executeQuery();
    while (rs.next()) {
        System.out.printf("ID: %d, Name: %s, Email: %s%n",
            rs.getInt("id"),
            rs.getString("name"),
            rs.getString("email"));
    }
}

Важно: Всегда используйте PreparedStatement для защиты от SQL-инъекций.

2. MongoDB в Java: гибкость документной модели

2.1. Подключение через MongoDB Sync Driver

Добавьте в pom.xml:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.11.1</version>
</dependency>

Подключение к локальной MongoDB:

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;

MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
MongoDatabase database = mongoClient.getDatabase("mydb");
System.out.println("Подключение к MongoDB установлено");

2.2. CRUD-операции с документами

Работаем с коллекцией users:

import com.mongodb.client.MongoCollection;
import org.bson.Document;
import static com.mongodb.client.model.Filters.*;

MongoCollection<Document> collection = database.getCollection("users");

// CREATE — вставка документа
Document user = new Document("name", "Анна Смирнова")
    .append("email", "anna@example.com")
    .append("age", 28)
    .append("skills", List.of("Java", "MongoDB", "Spring"));
collection.insertOne(user);

// READ — поиск по возрасту
Document found = collection.find(eq("age", 28)).first();
System.out.println("Найден: " + found.toJson());

// UPDATE — добавление навыка
collection.updateOne(
    eq("email", "anna@example.com"),
    new Document("$push", new Document("skills", "Docker"))
);

// DELETE — удаление по email
collection.deleteOne(eq("email", "anna@example.com"));

Обратите внимание: схема MongoDB не фиксирована — каждый документ может иметь разный набор полей.

3. Сравнение подходов: когда что выбирать?

Рассмотрим ключевые различия на практике:

  • Схема данных: PostgreSQL требует жёсткой схемы (миграции), MongoDB — гибкая (схема на уровне приложения).
  • Транзакции: PostgreSQL поддерживает ACID-транзакции «из коробки»; MongoDB — с версии 4.0, но с ограничениями.
  • Производительность: MongoDB быстрее на операциях записи и чтения простых документов; PostgreSQL — на сложных JOIN и агрегациях.
  • Инструменты Java: Для PostgreSQL — JDBC, Hibernate, Spring Data JPA; для MongoDB — MongoDB Sync Driver, Spring Data MongoDB.

Практический совет: Если у вас строгая бизнес-логика с множеством связей — выбирайте PostgreSQL. Если вам нужна быстрая разработка и масштабирование — MongoDB.

3.1. Пример выбора для микросервиса

Допустим, вы пишете сервис каталога товаров. Товары имеют переменное количество характеристик (цвет, размер, вес). Здесь MongoDB будет удобнее — вы просто добавляете поля в документ без миграций. А вот для сервиса заказов, где важны целостность данных и транзакции, лучше взять PostgreSQL.

Заключение

Мы рассмотрели практические примеры работы с PostgreSQL и MongoDB из Java. Обе базы данных имеют сильные стороны:

  • PostgreSQL — надёжность, транзакции, сложные запросы.
  • MongoDB — гибкость, скорость разработки, горизонтальное масштабирование.

Начинайте с выбора подходящей БД под вашу задачу, а не под «модный стек». Используйте JDBC или Spring Data

Блоги

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