CRUD với MongoDB trong SpringBoot
NỘI DUNG BÀI VIẾT
Mình đã giới thiệu tới mọi người về khái niệm NoSQL ở bài viết trước. Bài viết này mình sẽ hướng dẫn mọi người CRUD một ứng dụng SpringBoot đơn giản với MongoDB. Bài viết này mình sẽ sử dụng các kiến thức liên quan tới RESTful API
Cài đặt thư viện
Mọi người tạo một ứng dụng Spring Boot ở trong IntelIJ hoặc trên https://start.spring.io/
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
Code language: JavaScript (javascript)
Cấu hình file application.properties
Chúng ta truy cập vào file application.properties được để ở trong resource và chỉnh sửa như sau:
spring.data.mongodb.uri=mongodb://localhost:27017/employee_management
Code language: JavaScript (javascript)
CRUD đơn giản với MongoDB
Chuẩn bị
- Model: Mọi người tạo class DatabaseSequence, Employee có các thuộc tính như sau
DatabaseSequence.java
package com.example.demo.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "database_sequences")
public class DatabaseSequence {
@Id
private String id;
private long seq;
public DatabaseSequence() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public long getSeq() {
return seq;
}
public void setSeq(long seq) {
this.seq = seq;
}
}
Code language: JavaScript (javascript)
Employee.java
package com.example.demo.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "Employee")
public class Employee {
@Transient
public static final String SEQUENCE_NAME = "users_sequence";
@Id
private Long id;
@Indexed(unique = true)
private String firstName;
private String lastName;
@Indexed(unique = true)
private String email;
public Employee() {
}
public Employee(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Code language: JavaScript (javascript)
- Repository: Sau khi tạo xong class Employee chúng ta tiến hành tạo interface EmployeeRepository kế thừa từ interface MongoRepository có sẵn của Spring.
package com.example.demo.repository;
import com.example.demo.model.Employee;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends MongoRepository<Employee, Long> {
}
Code language: CSS (css)
Mình sử dụng annotation @Repository để Spring hiểu đây là một Repository và sẽ được quản lý bởi Spring mà không cần phải khai báo @Bean ở config giống như Spring MVC nữa.
- Service: Chúng ta sẽ tạo một class SequenceGeneratorService.
SequenceGeneratorService.java
package com.example.demo.service;
import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;
import java.util.Objects;
import com.example.demo.model.DatabaseSequence;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
@Service
public class SequenceGeneratorService {
private MongoOperations mongoOperations;
@Autowired
public SequenceGeneratorService(MongoOperations mongoOperations) {
this.mongoOperations = mongoOperations;
}
public long generateSequence(String seqName) {
DatabaseSequence counter = mongoOperations.findAndModify(query(where("_id").is(seqName)),
new Update().inc("seq",1), options().returnNew(true).upsert(true),
DatabaseSequence.class);
return !Objects.isNull(counter) ? counter.getSeq() : 1;
}
}
Code language: JavaScript (javascript)
- Oki vậy là bước chuẩn bị đã xong giờ chúng ta sẽ tiến hành viết các API cho việc thêm sửa xóa và hiển thị một Employee ở Employee Controller
EmployeeController.java
package com.example.demo.controller;
import com.example.demo.model.Employee;
import com.example.demo.repository.EmployeeRepository;
import com.example.demo.service.SequenceGeneratorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping("/api/v1")
public class EmployeeController {
@Autowired
private EmployeeRepository employeeRepository;
@Autowired
private SequenceGeneratorService sequenceGeneratorService;
@GetMapping("/employees")
public ResponseEntity<List<Employee>> getAllEmployees() {
return new ResponseEntity<>(employeeRepository.findAll(), HttpStatus.OK);
}
@GetMapping("/employees/{id}")
public ResponseEntity<Employee> getEmployeeById(@PathVariable(value = "id") Long employeeId) {
Optional<Employee> employeeOptional = employeeRepository.findById(employeeId);
return employeeOptional.map(employee -> ResponseEntity.ok().body(employee)).orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
@PostMapping("/employees")
public ResponseEntity<Employee> createEmployee(@RequestBody Employee employee) {
employee.setId(sequenceGeneratorService.generateSequence(Employee.SEQUENCE_NAME));
return new ResponseEntity<>(employeeRepository.save(employee), HttpStatus.CREATED);
}
@PutMapping("/employees/{id}")
public ResponseEntity<Employee> updateEmployee(@PathVariable(value = "id") Long employeeId,
@RequestBody Employee employeeDetails) {
Optional<Employee> employeeOptional = employeeRepository.findById(employeeId);
return employeeOptional.map(employee -> {
employee.setEmail(employeeDetails.getEmail());
employee.setLastName(employeeDetails.getLastName());
employee.setFirstName(employeeDetails.getFirstName());
final Employee updatedEmployee = employeeRepository.save(employee);
return new ResponseEntity<>(updatedEmployee, HttpStatus.OK);
}).orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
@DeleteMapping("/employees/{id}")
public ResponseEntity<Employee> deleteEmployee(@PathVariable(value = "id") Long employeeId) {
Optional<Employee> employeeOptional = employeeRepository.findById(employeeId);
return employeeOptional.map(employee -> {
employeeRepository.delete(employee);
return new ResponseEntity<>(employee, HttpStatus.NO_CONTENT);
}).orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
}
Code language: PHP (php)
Test với Postman
- Tạo mới một employee với HTTP POST request
- Cập nhật thông tin một employee với PUT request
- Xóa thông tin một employee với DELETE request
- Lấy thông tin một employee với GET request
- Lấy ra danh sách tất cả các employee
Leave a Reply