Введение в работу с базами данных в Java
Современная Java-разработка редко обходится без взаимодействия с системами хранения данных. Выбор между реляционными (SQL) и нереляционными (NoSQL) базами данных — одна из ключевых архитектурных задач. В этой статье на примере PostgreSQL (классическая реляционная СУБД) и MongoDB (документоориентированная NoSQL) мы разберем основные подходы, лучшие практики и приведем готовые примеры кода. Материал будет полезен как начинающим, так и опытным разработчикам, желающим систематизировать знания.
1. Подключение и работа с PostgreSQL в Java
1.1 Настройка JDBC-драйвера
PostgreSQL — одна из самых популярных реляционных баз данных. Для работы с ней из Java используется драйвер JDBC. Добавьте зависимость в pom.xml (Maven):
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.6.0</version>
</dependency>
После добавления драйвера можно устанавливать соединение:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class PostgresConnection {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/mydb";
String user = "admin";
String password = "secret";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
System.out.println("Соединение с PostgreSQL установлено!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
1.2 CRUD-операции (Create, Read, Update, Delete)
Рассмотрим пример работы с таблицей users. Создание записи:
String insertSQL = "INSERT INTO users (name, email) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
pstmt.setString(1, "Иван Петров");
pstmt.setString(2, "ivan@example.com");
pstmt.executeUpdate();
}
Чтение данных:
String selectSQL = "SELECT * FROM users WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(selectSQL)) {
pstmt.setInt(1, 1);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name") + " - " + rs.getString("email"));
}
}
Обновление и удаление выполняются аналогично через UPDATE и DELETE с использованием PreparedStatement. Всегда используйте параметризованные запросы — это защищает от SQL-инъекций.
1.3 Использование пула соединений (HikariCP)
В продакшене не рекомендуется открывать новое соединение на каждый запрос. Используйте пул соединений. Добавьте зависимость:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
Конфигурация:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost:5432/mydb");
config.setUsername("admin");
config.setPassword("secret");
config.setMaximumPoolSize(10);
HikariDataSource ds = new HikariDataSource(config);
Connection conn = ds.getConnection();
2. Подключение и работа с MongoDB в Java
2.1 Настройка MongoDB Java Driver
MongoDB хранит данные в формате JSON-подобных документов. Для работы используется официальный драйвер. Зависимость Maven:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.10.2</version>
</dependency>
Подключение к локальной базе данных:
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class MongoConnection {
public static void main(String[] args) {
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
MongoDatabase database = mongoClient.getDatabase("mydb");
MongoCollection<Document> collection = database.getCollection("users");
System.out.println("Подключение к MongoDB установлено!");
}
}
2.2 CRUD-операции с документами
Создание документа (аналог вставки строки):
Document user = new Document("name", "Мария Сидорова")
.append("email", "maria@example.com")
.append("age", 28);
collection.insertOne(user);
Чтение документов с фильтром:
Document query = new Document("name", "Мария Сидорова");
Document result = collection.find(query).first();
System.out.println(result.toJson());
Обновление:
Document filter = new Document("name", "Мария Сидорова");
Document update = new Document("$set", new Document("age", 29));
collection.updateOne(filter, update);
Удаление:
Document deleteFilter = new Document("name", "Мария Сидорова");
collection.deleteOne(deleteFilter);
2.3 Работа с индексами и агрегацией
Для ускорения запросов создавайте индексы:
collection.createIndex(new Document("email", 1)); // 1 - по возрастанию
Пример агрегации для подсчета пользователей по возрасту:
List<Document> pipeline = Arrays.asList(
new Document("$group", new Document("_id", "$age")
.append("count", new Document("$sum", 1)))
);
for (Document doc : collection.aggregate(pipeline)) {
System.out.println(doc.toJson());
}
3. Сравнение PostgreSQL и MongoDB: когда что выбирать?
3.1 Ключевые различия
- Схема данных: PostgreSQL требует жесткой схемы (таблицы, типы колонок). MongoDB — гибкая схема, документы могут различаться по структуре.
- Транзакции: PostgreSQL поддерживает ACID-транзакции на уровне строк. MongoDB с версии 4.0 также поддерживает multi-document транзакции, но они менее производительны.
- Связи: В PostgreSQL связи реализуются через JOIN. В MongoDB — через в