Hướng Dẫn Toàn Diện: Tích Hợp MongoDB với Spring Boot (CRUD, Lombok, Giao Dịch, Atlas)
Giới thiệu
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách tích hợp MongoDB với Spring Boot từ những bước cài đặt đầu tiên cho đến việc xây dựng một ứng dụng CRUD hoàn chỉnh. Chúng ta sẽ thảo luận về sự khác biệt giữa JPA/ORM và cơ sở dữ liệu tài liệu, cũng như cách sử dụng các mối quan hệ với @DBRef, giao dịch, các thực tiễn tốt nhất về ResponseEntity, sử dụng Lombok và kết nối với MongoDB Atlas. Bài viết sẽ cung cấp các đoạn mã có thể sao chép và dán để bạn có thể áp dụng ngay lập tức.
Mục lục
- Cài đặt MongoDB
- Khái niệm cơ bản về MongoDB
- Sự khác biệt giữa ORM, JPA và MongoDB
- Tích hợp MongoDB vào Spring Boot
- Sử dụng ResponseEntity trong Spring Boot
- Sử dụng Lombok trong Java
- Quản lý mối quan hệ trong MongoDB
- Giao dịch trong MongoDB
- Kết nối Spring Boot với MongoDB Atlas
- Kiểm tra và khắc phục sự cố
- Mã nguồn CRUD sinh viên
- Kết luận
1. Cài đặt MongoDB
Các bước cài đặt MongoDB trên các hệ điều hành
Hãy sử dụng tài liệu chính thức của MongoDB để có hướng dẫn cài đặt cụ thể cho từng nền tảng.
macOS (sử dụng Homebrew)
- Cài đặt Homebrew (nếu bạn chưa có).
- Thêm kho lưu trữ chính thức của MongoDB và cài đặt máy chủ cộng đồng:
bash
brew tap mongodb/brew
brew update
brew install mongodb-community
# khởi động
brew services start mongodb/brew/mongodb-community
# dừng
brew services stop mongodb/brew/mongodb-community
Ubuntu / Debian (sử dụng kho lưu trữ chính thức)
bash
# 1. Nhập khóa GPG công khai, thêm kho lưu trữ
# 2. Cập nhật và cài đặt
sudo apt update
sudo apt install -y mongodb-org
# khởi động
sudo systemctl start mongod
sudo systemctl enable mongod
Windows (sử dụng trình cài đặt MSI)
- Tải xuống trình cài đặt MongoDB Community MSI từ trang tải xuống của MongoDB.
- Chạy trình cài đặt MSI, làm theo hướng dẫn (chọn cài đặt “Complete” và có thể cài đặt MongoDB như một dịch vụ Windows).
- Khởi động dịch vụ
MongoDB.
2. Khái niệm cơ bản về MongoDB
- Tài liệu — một đối tượng JSON/BSON (giống như một hàng nhưng linh hoạt). Ví dụ:
{ _id: ObjectId("..."), name: "Aisha", address: "Dhaka" }. - Bộ sưu tập — nhóm các tài liệu (giống như bảng SQL nhưng không có sơ đồ).
- Cơ sở dữ liệu — chứa các bộ sưu tập.
- BSON — mã hóa nhị phân được MongoDB sử dụng.
_id— khóa chính, tự động được sinh ra nếu bạn không cung cấp.- Chỉ mục — tăng tốc truy vấn (tạo khi cần thiết).
- Replica Set — nhiều phiên bản mongod cung cấp độ tin cậy và cho phép giao dịch nhiều tài liệu.
- Sharding — mở rộng theo chiều ngang cho các tập dữ liệu lớn.
MongoDB là một cơ sở dữ liệu tài liệu được thiết kế để dễ phát triển và mở rộng.
3. Sự khác biệt giữa ORM, JPA và MongoDB
ORM & JPA (cơ sở dữ liệu quan hệ):
- ORM ánh xạ các đối tượng Java ↔ bảng quan hệ.
- JPA (Java Persistence API) là API chuẩn;
spring-data-jpalà lớp tiện lợi của Spring thực hiện các kho chứa trên các nhà cung cấp JPA (Hibernate).
MongoDB (cơ sở dữ liệu tài liệu) + Spring Data MongoDB:
- Tài liệu thay vì hàng; không có SQL, không cần sơ đồ RDBMS.
- Spring Data cung cấp một mô-đun Mongo-specific:
spring-boot-starter-data-mongodb. Bạn không sử dụng các chú thích JPA cho Mongo — sử dụng@Document,@Id, vàMongoRepository.
4. Tích hợp MongoDB vào Spring Boot
Thiết lập dependencies trong pom.xml
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Cấu hình application.properties
properties
# MongoDB cục bộ
spring.data.mongodb.uri=mongodb://localhost:27017/studentsdb
Kết nối tới MongoDB Atlas
properties
# Kết nối tới Atlas (thay thế các tham số)
spring.data.mongodb.uri=mongodb+srv://<username>:<password>@cluster0.xxxxxx.mongodb.net/studentsdb?retryWrites=true&w=majority
5. Sử dụng ResponseEntity trong Spring Boot
ResponseEntity<T> đại diện cho toàn bộ phản hồi HTTP (trạng thái, tiêu đề, thân). Sử dụng nó để gửi mã trạng thái thích hợp từ các controller của bạn.
Ví dụ về Controller
java
@PostMapping("/api/students")
public ResponseEntity<Student> create(@RequestBody Student s) {
Student created = service.create(s);
URI location = URI.create("/api/students/" + created.getId());
return ResponseEntity.created(location).body(created);
}
6. Sử dụng Lombok trong Java
Lombok loại bỏ các getter/setter/constructor lặp đi lặp lại. Ví dụ:
java
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(collection = "students")
public class Student {
@Id
private String id;
private String name;
private String address;
private String phone;
}
7. Quản lý mối quan hệ trong MongoDB
Hai kiểu mối quan hệ chính:
- Embedding — bao gồm tài liệu liên quan bên trong tài liệu cha (đọc nhanh, không chuẩn hóa).
- Referencing (
@DBRef) — lưu trữ một tham chiếu đến tài liệu khác (tránh trùng lặp nhưng yêu cầu tìm kiếm bổ sung).
8. Giao dịch trong MongoDB
MongoDB hỗ trợ giao dịch ACID đa tài liệu. Để sử dụng chúng với Spring Data MongoDB, bạn cần chạy MongoDB như một replica set.
Cấu hình giao dịch tối thiểu
java
@Configuration
@EnableTransactionManagement
public class MongoConfig {
@Bean
MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
}
9. Kết nối Spring Boot với MongoDB Atlas
- Đăng ký MongoDB Atlas và tạo một cụm miễn phí.
- Tạo người dùng cơ sở dữ liệu.
- Thêm địa chỉ IP của bạn vào quyền truy cập mạng.
- Nhận chuỗi kết nối từ Atlas và thiết lập trong
application.properties.
10. Kiểm tra và khắc phục sự cố
- Không thể kết nối đến Atlas — kiểm tra whitelist IP và mã hóa URL trong mật khẩu.
- Giao dịch không hoạt động — đảm bảo Mongo chạy như một replica set.
11. Mã nguồn CRUD sinh viên
Student.java (với Lombok)
java
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(collection = "students")
public class Student {
@Id
private String id;
private String name;
private String address;
private String phone;
}
StudentService
java
@Service
public class StudentService {
private final StudentRepository repo;
public StudentService(StudentRepository repo) { this.repo = repo; }
public Student create(Student s) { return repo.save(s); }
}
StudentController
java
@RestController
@RequestMapping("/api/students")
public class StudentController {
private final StudentService service;
public StudentController(StudentService service) { this.service = service; }
}
12. Kết luận
Bạn đã thiết lập MongoDB cục bộ, tích hợp nó vào dự án Spring Boot và tìm hiểu cách nó khác với JPA/ORM. Bạn có thể xây dựng một REST API CRUD hoàn chỉnh dựa trên MongoDB. Hãy thử nghiệm với các chỉ mục để tối ưu hóa truy vấn và triển khai ứng dụng của bạn lên nền tảng đám mây.