images
05/10/2022 12:08 am

Dựng Rest API có tích hợp Database sử dụng Spring Boot

Hiện nay kiến trúc Microservices đã phổ cập trên mọi hệ thống. Trên tất cả các ngôn ngữ lập trình, các nhà phát triển đều cung cấp đa dạng các framework hỗ trợ Microservices.

Trong xu hướng này, Restful API là dạng API được sử dụng nhiều nhất, bên cạnh các giao thức khác như GRPC. Trong bài này, mình sẽ giới thiệu cách sử dụng Spring Boot để xây dựng Rest API trên nền tảng ngôn ngữ Java. Đồng thời cũng mô tả các thức một chương trình SpringBoot kết nối với cơ sở dữ liệu và trả về thông tin cho người dùng. Mời các bạn theo dõi.

Web Application (Traditional Style)


Đây là kiến trúc mô hình truyền thống


Trong mô hình này, một ứng dụng WebApplication được triển khai phân tán trên các server. Một phần mềm phân tải NGINX được thiết lập để đảm bảo hệ thống có tính sẵn sàng cao và chịu được tải lớn. Đảm bảo khi 1 ứng dụng chết thì hệ thống vẫn còn hoạt động trên các ứng dụng còn lại.

Web Application sẽ cần kết nối với Database để thao tác với dữ liệu:

Sự phát triển của các ứng dụng Mobile, Web cũng như Desktop App đòi hỏi sự linh hoạt về mặt kiến trúc của hệ thống nhằm hỗ trợ sự phát triển đa nền tảng. Không thể tạo ra các server backend cho từng ứng dụng khác nhau vì như thế chi phí quá lớn, dễ sinh lỗi và nhiều vấn đề phát sinh khi maintain hệ thống.

Một mô hình mới được đề xuất: Tách biệt tầng Presentation với tầng xử lý Logic.


  • Tầng Presentation: Trả về nội dung là các file Html, CSS, JavaScript có thể viết bằng NodeJS

  • Tầng xử lý Logic sử dụng Restful API: Dữ liệu thực sự được trao đổi thông qua API này.



Sử dụng Spring Boot để tạo Restful API


Spring Boot là thư viện trong Java giúp việc tạo ra ứng dụng vô cùng nhanh và tiện lợi. 



Java Rest API


Trong mô hình này, client sẽ trao đổi với server thông qua Restful API để lấy và ghi dữ liệu. Dữ liệu được tầng API lưu lại trên Database. Trong thực tế, mô hình này còn cần bổ sung thêm layer cache sử dụng Redis, Memcached để tăng tốc độ đọc dữ liệu.


Tìm hiểu về Restful API


REST viết tắt của REpresentational State Transfer. Đây là phong cách thiết kế hệ thống phân tán siêu phương tiện (distributed hypermedia systems) được giới thiệu đầu tiên năm 2000 bởi Roy Fielding trong nghiên cứu của mình.

- Resource: Nguyên tắc dựa trên các resource. Ví dụ: bài Post, thực thể Employee, thực thể Books… 

- Sử dụng Id để định danh resource, ví dụ: /books/1 → Book có id = 1.

- Data format có thể nhiều dạng: Html, Json, XML,.... Tuỳ thuộc vào client yêu cầu

- Restful còn biết đến như là một phương thức phi trạng thái (Stateless). Điều đó có nghĩa là khác với ứng dụng Web thông thường, với Restful không có khái niệm về Session.

Resource Method: Dự trên giao thức của HTTP nên có các method sau:

  • GET: Lấy dữ liệu

  • POST: Tạo dữ liệu

  • PUT: Tạo hoặc update dữ liệu

  • DELETE: Xoá dữ liệu


Tạo Project Maven trong Java (Có thể dùng Gradle).

Nếu sử dụng IntelliJ + Eclipse thì tạo: File > New Project > Maven


Sử dụng file pom.xml sau:


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

   <modelVersion>4.0.0</modelVersion>


   <groupId>org.techzonefun</groupId>

   <artifactId>techvid-api</artifactId>

   <version>1.0-SNAPSHOT</version>

   <parent>

       <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-parent</artifactId>

       <version>2.3.3.RELEASE</version>

       <relativePath/> <!-- lookup parent from repository -->

   </parent>

   <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-jpa</artifactId>

       </dependency>

       <dependency>

           <groupId>com.h2database</groupId>

           <artifactId>h2</artifactId>

       </dependency>


   </dependencies>

   <build>

       <plugins>

           <plugin>

               <groupId>org.springframework.boot</groupId>

               <artifactId>spring-boot-maven-plugin</artifactId>

           </plugin>

       </plugins>

   </build>

</project>


(Thay đổi GroupId + ArtifactId tương ứng với project)


File resources/application.properties


#spring.datasource.url=jdbc:h2:mem:testdb

spring.datasource.url=jdbc:h2:file:~/data/demo

spring.datasource.driverClassName=org.h2.Driver

spring.datasource.username=sa

spring.datasource.password=password

spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

spring.h2.console.enabled=true

spring.jpa.hibernate.ddl-auto=update


Tạo file Application.java


package techvid;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication

public class Application {

   public static void main(String[] args) {

       SpringApplication.run(Application.class, args);

   }


Tạo file VideoController.java


package techvid;



import org.springframework.web.bind.annotation.*;


@RestController

public class VideoController {


   @RequestMapping("/")

   public String index() {

       return "Greetings from Spring Boot!";

   }

  }


Bật ứng dụng. Vào trình duyệt đánh link: localhost:8080


Java Rest API + Database


Trong phạm vi bài này, Database mà chúng ta sẽ làm việc là Database H2. Do sử dụng H2 database dạng database nhúng (Embedded) nên không cần cài thêm. Nếu bạn muốn connect vào Oracle, MySql… thì cần driver tương ứng. Và thay đổi cấu hình trong file application.properties. 

Trường hợp muốn kết nối với MySQL, hãy sử dụng Maven để khai báo driver MySQL:


<dependency>

   <groupId>mysql</groupId>

   <artifactId>mysql-connector-java</artifactId>

</dependency>


Tiếp theo, để dùng MySQL, hãy thay đổi các giá trị liên quan tới database tương ứng trừ thông tin 2 dòng cuối cùng resources/application.properties. 


spring.datasource.url=jdbc:mysql://${MYSQL_HOST}:3306/db_example

spring.datasource.username=sa

spring.datasource.password=password

spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

spring.datasource.driverClassName=com.mysql.jdbc.Driver


Sau khi cấu hình xong với Database, bạn đi vào viết code JAVA.

Để thao tác với database, bạn sử dụng Interface Repository của Spring Data để làm việc với Database. Đây là thư viện vô cùng tiện lợi khi thao tác với database do JPARepository đã cung cấp sẵn các hàm thao tác với DB: findAll, findById, Sort, Paging

Bạn khai báo interface của mình như sau:


package techvid;


interface VideoRepository extends JpaRepository<Video, Long> {

}



Lấy Videos: GET http://localhost:8080/videos

Trường hợp này bạn thêm code trong file VideoController.java:


@RequestMapping("/videos")

public List<Video> getAllVideos(@RequestParam(name="name", required = false) String name) {

   if (!StringUtils.isEmpty(name)) {

       return videoRepository.findByName(name);

   }

   return videoRepository.findAll();

}


GET http://localhost:8080/videos?name=Java Tutorial


Giả sử bạn muốn support request get sử dụng parameter, hãy sử dụng Annotation @RequestParam để lấy biến trong request gán vào chương trình


Tạo Video: POST http://localhost:8080/videos


@PostMapping("/videos")

public Video createVideo(@RequestBody Video video) {

   return videoRepository.save(video);

}


Sử dụng Annotation @RequestBody để lấy body của request và tự động convert thành entity


Xoá Video: DELETE http://localhost:8080/videos/1


@DeleteMapping("/videos/{id}")

public void deleteVideo(@PathVariable(name="id") Long id) {

   videoRepository.deleteById(id);

}


Trường hợp muốn lấy được giá trị id trên path của URL, bạn sử dụng Annotation @PathVariable để lấy giá trị của biến trong path của url


Update Video: PUT http://localhost:8080/videos/1

Phương thức PUT được sử dụng để cập nhật một resource theo quy định của Restful API. Ở đây ta cài đặt method để update video:


@PutMapping("/videos/{id}")

public Video updateVideo(@PathVariable(name="id") Long id, @RequestBody Video video) {

   Optional<Video> oldVideo = videoRepository.findById(id);

   if (oldVideo.isPresent()) {

       oldVideo.get().setName(video.getName());

       oldVideo.get().setAuthor(video.getAuthor());

       oldVideo.get().setCategory(video.getCategory());

       return videoRepository.save(oldVideo.get());

   }

   return videoRepository.save(video);

}



Tùy biến câu truy vấn:


package techvid;


interface VideoRepository extends JpaRepository<Video, Long> {

@Query(value = "SELECT * FROM video v WHERE v.name = ?1", nativeQuery = true)

List<Video> findByName(String name);

}


Để thuận tiện, bạn hãy dùng PostMan để tạo truy vấn với API. Download tại đây:


https://www.postman.com/downloads/


Sau khi cài đặt PostMan, bạn có thể dễ dàng thao tác với các Method như POST, PATCH, PUT, DELETE… và các request này có thể được lưu lại để sử dụng về sau.

Với ứng dụng Spring Boot kết nối vào server database h2 chạy embedded, bạn có thể xem thông tin của database đó bằng cách như sau:


  • Bật chế độ view DB trên trình duyệt qua file properties: spring.h2.console.enabled=true

  • Restart ứng dụng JAVA

  • Vào browser: http://localhost:8080/h2-console/


Source code của bài viết, các bạn xem TẠI ĐÂY nhé.


Mời các bạn xem thêm bài viết: Java Queue - Tại sao phải dùng kiểu cấu trúc dữ liệu này?


- Tech Zone


Thư giãn chút nào!!!

Bài viết liên quan