Введение: зачем 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