CRUD đơn giản với RESTful API trong Spring Boot Java
Với việc quản lý các tài nguyên thì Spring Boot có thể sử dụng RESTful API để quản lý tài nguyên rất tiện lợi và giải quyết được nhiều trở ngại mà các nhà phát triển ứng dụng đang còn gặp phải. Cho nên trong bài viết này chúng ta sẽ cùng tìm hiểu cách thức hoạt động và code một ứng dụng nhỏ sử dụng RESTful API trong Spring Boot nhé !!
Trước khi tìm hiểu về cách xây dựng một ứng dụng với RESTful API thì các bạn có thể tìm hiểu RESTful API là gì, Các phương thức sử dụng trong RESTful là các phương thức như thế nào qua hai bài viết sau:
1. Chuẩn bị
Tạo một Entity Model
Đầu tiên, bạn cần tạo một Entity Model để mô tả đối tượng mà bạn muốn thực hiện các hoạt động CRUD. Ví dụ, nếu bạn đang tạo một RESTful API để quản lý các sản phẩm, thì bạn có thể tạo một lớp Product để đại diện cho sản phẩm.
Bước 1: Tạo một Entity Model cho Product: Đầu tiên, bạn cần tạo một lớp Product để mô tả sản phẩm. Lớp Product này sẽ là một Entity Model được đánh dấu với @Entity annotation, và có các thuộc tính để mô tả các thông tin về sản phẩm, ví dụ như id, tên, mô tả, giá cả, v.v.
Bài viết này được đăng tại [free tuts .net]
Ví dụ:
@Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private String description; private double price; // Constructors, getters, and setters }
Bước 2: Tạo một interface ProductRepository để thao tác với cơ sở dữ liệu: Sau khi tạo một Entity Model, bạn cần tạo một Repository để thực hiện các hoạt động CRUD. Repository sẽ cung cấp các phương thức để lấy dữ liệu từ cơ sở dữ liệu, thêm, cập nhật hoặc xóa dữ liệu.
Ví dụ:
public interface ProductRepository extends JpaRepository<Product, Long> { }
Bước 3: Tạo một Service cho Product: Bạn cần tạo một Service để thực hiện các hoạt động nghiệp vụ cho Product. Service sẽ cung cấp các phương thức để thêm, cập nhật hoặc xóa dữ liệu cho Product.
Ví dụ:
@Service public class ProductService { @Autowired private ProductRepository productRepository; //get product by id public Product getProductById(Long id) { return productRepository.findById(id).orElse(null); } }
Bước 4: Tạo một Controller cho Product: Cuối cùng, bạn cần tạo một Controller để xử lý các yêu cầu từ client. Controller sẽ cung cấp các phương thức để thực hiện các hoạt động CRUD và xử lý các yêu cầu từ client.
Ví dụ:
@RestController @RequestMapping("/products") public class ProductController { @Autowired private ProductService productService; // Get all products // Get a product by id // Add a new product // Delete a product // Update a product
2. Các bước CREATE bằng RESTful API trong Spring Boot
Để tạo mới 1 product bằng RESTful API trong Spring Boot ta cần thực hiện các bước sau:
Bước 1: Bạn cần có một lớp Product chứa đầy đủ tất cả các thông tin sản phẩm như đã tạo ở bước chuẩn bị ở phía trên
Bước 2: Tạo một phương thức POST trong ProductController để xử lý yêu cầu tạo mới sản phẩm:
Ví dụ :
@PostMapping("/") public ResponseEntity<Product> createProduct(@RequestBody ProductRequest productRequest) { Product product = new Product(); product.setName(productRequest.getName()); product.setDescription(productRequest.getDescription()); product.setPrice(productRequest.getPrice()); Product createdProduct = productService.createProduct(product); return new ResponseEntity<>(createdProduct, HttpStatus.CREATED); }
Bước 3: Tạo một phương thức createProduct trong ProductService để thực hiện tạo mới sản phẩm trong cơ sở dữ liệu:
Ví dụ:
public Product addProduct(Product product) { return productRepository.save(product); }
3. Các bước GetAll product với RESTful API trong Spring Boot
Để thực hiện lấy tất cả các product từ cơ sở dữ liệu bằng RESTful API trong Spring Boot, ta cần thực hiện các bước sau:
Bước 1: Trong class ProductController, tạo phương thức getProducts() và chú thích nó bằng @GetMapping.
@GetMapping("/") public ResponseEntity<List<Product>> getAllProducts() { List<Product> products = productService.getAllProducts(); return new ResponseEntity<>(products, HttpStatus.OK); }
Bước 2: Trong phương thức getProducts() ở ProductService, gọi phương thức findAll() của interface ProductRepository để lấy tất cả các sản phẩm.
public List<Product> getAllProducts() { return productRepository.findAll(); }
Bước 3: Kiểm tra bằng cách xem trả về danh sách các sản phẩm bằng ResponseEntity với HttpStatus.OK.
Trong đó:
- @GetMapping("/products") chú thích phương thức getProducts() để nó xử lý yêu cầu GET tới đường dẫn "/products".
- productRepository là một instance của interface ProductRepository đã được khởi tạo bằng @Autowired.
- Phương thức findAll() của ProductRepository trả về danh sách các sản phẩm.
- ResponseEntity<List<Product>> trả về danh sách các sản phẩm dưới dạng JSON.
- HttpStatus.OK chứa mã trạng thái HTTP 200 - OK.
Sau khi đã thực hiện các bước trên, ta có thể sử dụng trình duyệt hoặc các công cụ như Postman để gửi yêu cầu GET đến địa chỉ "http://localhost:8080/products" và nhận được danh sách các sản phẩm dưới dạng JSON.
4. Các bước UPDATE với RESTful API trong Spring Boot
Để cập nhật thông tin của một sản phẩm từ cơ sở dữ liệu bằng RESTful API trong Spring Boot, ta cần thực hiện các bước sau:
Bước 1: Trong class ProductController, tạo phương thức updateProduct() và chú thích nó bằng @PutMapping.
Bước 2: Trong phương thức updateProduct(), gọi phương thức findById() của interface ProductRepository để tìm sản phẩm cần cập nhật.
Bước 3: Kiểm tra xem sản phẩm có tồn tại hay không. Nếu không, trả về ResponseEntity với HttpStatus.NOT_FOUND.
Ví dụ:
@PutMapping("/products/{id}") public ResponseEntity<Product> updateProduct(@PathVariable(value = "id") Long productId, @RequestBody Product productDetails) { Optional<Product> optionalProduct = productRepository.findById(productId); if (!optionalProduct.isPresent()) { return new ResponseEntity<Product>(HttpStatus.NOT_FOUND); } Product product = optionalProduct.get(); product.setName(productDetails.getName()); product.setDescription(productDetails.getDescription()); product.setPrice(productDetails.getPrice()); Product updatedProduct = productRepository.save(product); return new ResponseEntity<Product>(updatedProduct, HttpStatus.OK); }
Bước 4: Nếu sản phẩm tồn tại, cập nhật thông tin sản phẩm và gọi phương thức save() ở ProductService của interface ProductRepository để lưu thông tin mới vào cơ sở dữ liệu.
public Product updateProduct(Long id, Product product) { Product existingProduct = productRepository.findById(id).orElse(null); }
Bước 5: Trả về sản phẩm đã cập nhật bằng ResponseEntity với HttpStatus.OK.
Trong đó:
- @PutMapping("/products/{id}") chú thích phương thức updateProduct() để nó xử lý yêu cầu PUT tới đường dẫn "/products/{id}" (trong đó {id} là id của sản phẩm cần cập nhật).
- @PathVariable(value = "id") Long productId chú thích biến productId để nó lấy giá trị của {id} trong đường dẫn.
- @RequestBody Product productDetails chú thích biến productDetails để nó lấy thông tin sản phẩm mới từ body của yêu cầu PUT (dưới dạng JSON).
- Phương thức findById() của ProductRepository tìm sản phẩm cần cập nhật.
- Optional<Product> optionalProduct là một Optional để xử lý trường hợp sản phẩm không tồn tại.
- Nếu sản phẩm không tồn tại, trả về ResponseEntity với HttpStatus.NOT_FOUND.
- Nếu sản phẩm tồn tại, cập nhật thông tin sản phẩm và gọi phương thức save() của ProductRepository để lưu thông tin mới vào cơ sở dữ liệu.
- Trả về sản phẩm đã cập nhật bằng ResponseEntity với HttpStatus.OK.
5. Các bước DELETE với RESTful API trong Spring Boot
Để xóa thông tin của một sản phẩm từ cơ sở dữ liệu bằng RESTful API trong Spring Boot, ta cần thực hiện các bước sau:
Bước 1: Trong class ProductController, bạn cần tạo một phương thức trong Controller của mình để xử lý yêu cầu DELETE. Phương thức này sẽ được đánh dấu bằng @DeleteMapping và có thể nhận vào một đường dẫn URI và các tham số khác tùy chọn.
Ví dụ:
@DeleteMapping("/product/{id}") public ResponseEntity<Void> deleteProduct(@PathVariable Long id) { // xóa sản phẩm có id tương ứng trong cơ sở dữ liệu ProductService.deleteProduct(id); return ResponseEntity.noContent().build(); }
Bước 2: Tạo phương thức xóa dữ liệu trong Service: Sau khi đã định nghĩa phương thức DELETE trong Controller, bạn cần tạo một phương thức trong Service để xóa dữ liệu trong cơ sở dữ liệu.
Ví dụ:
public void deleteProduct(Long id) { ProductRepository.deleteById(id); }
Bước 3: Cấu hình cơ sở dữ liệu: Bạn cần đảm bảo rằng cấu hình cơ sở dữ liệu của bạn cho phép xóa dữ liệu. Ví dụ, nếu bạn đang sử dụng cơ sở dữ liệu MySQL, bạn cần đảm bảo rằng người dùng mà ứng dụng của bạn sử dụng có đủ quyền để xóa dữ liệu.
Bước 4: Kiểm tra và thực hiện yêu cầu DELETE: Bạn có thể sử dụng các công cụ kiểm tra API như Postman hoặc curl để thực hiện yêu cầu DELETE và kiểm tra kết quả.
Ví dụ:
DELETE http://localhost:8080/students/1
Kết quả trả về:
HTTP/1.1 204 No Content
Trong ví dụ trên, yêu cầu DELETE sẽ xóa sản phẩm có ID là 1 trong cơ sở dữ liệu và trả về mã trạng thái HTTP 204 (No Content) để cho biết rằng yêu cầu đã được xử lý thành công và không có nội dung trả về.
6. Các câu hỏi thường gặp
CRUD là gì và nó có liên quan gì đến RESTful API?
CRUD là một thuật ngữ để chỉ các hoạt động cơ bản với cơ sở dữ liệu bao gồm tạo (Create), đọc (Read), cập nhật (Update) và xóa (Delete) dữ liệu. CRUD là một phần quan trọng của các ứng dụng web vì chúng cho phép người dùng tương tác với cơ sở dữ liệu thông qua giao diện người dùng hoặc các yêu cầu API.
RESTful API là một kiểu kiến trúc web cho phép người dùng tương tác với các tài nguyên (resource) trên máy chủ thông qua các yêu cầu HTTP như GET, POST, PUT và DELETE. RESTful API thường được sử dụng để tạo các ứng dụng web hoặc di động để lấy, tạo, cập nhật và xóa các tài nguyên từ máy chủ.
Vì vậy, CRUD và RESTful API có mối liên hệ chặt chẽ với nhau. Một RESTful API tốt thường hỗ trợ các yêu cầu CRUD để cho phép người dùng tương tác với các tài nguyên trên máy chủ. Cụ thể, GET yêu cầu để lấy dữ liệu (Read), POST để tạo mới dữ liệu (Create), PUT hoặc PATCH để cập nhật dữ liệu (Update), và DELETE để xóa dữ liệu (Delete). Vì vậy, CRUD là một phần không thể thiếu của một RESTful API.
Làm thế nào để thêm dữ liệu mới vào cơ sở dữ liệu thông qua RESTful API?
Để thêm dữ liệu mới vào cơ sở dữ liệu thông qua RESTful API, chúng ta cần sử dụng phương thức POST. Để tìm hiểu kỹ hơn bạn có thể đọc tiếp ở phần 2. Phương thức CREATE với RESTful API trong Spring Boot
Làm thế nào để lấy dữ liệu từ cơ sở dữ liệu và trả về dữ liệu dưới dạng JSON?
Để lấy dữ liệu từ cơ sở dữ liệu và trả về dưới dạng JSON thông qua RESTful API, chúng ta cần sử dụng phương thức GET.
7. Kết bài viết
Vậy ở bài viết này mình đã hướng dẫn mọi người cách viết CRUD với RESTful API đơn giản với Spring Boot. Hi vọng bài viết này sẽ có ích với mọi người.