Mục lục
Hibernate đến thời điểm tại có thể xem là một ORM có tầm ảnh hưởng lớn trong cộng đồng Java. Đóng vai trò là một ORM framework đi đầu trong lĩnh vực, đa số các dự án đều tin cậy và sử dụng Hibernate.
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách sử dụng Hibernate trong Spring Boot. Có thể các bạn sẽ ngỡ ngàng rằng bản thân dependency spring-boot-starter-data-jpa đã bao gồm Hibernate trong đó, nhưng nếu các bạn không để ý thì chúng ta cùng tìm hiểu qua bài viết này nhé.
Maven Dependency
Nếu chúng ta mở pom.xml, chúng ta sẽ thấy rằng chúng ta có spring-boot-starter-web và spring-boot-starter-test là các dependency để chúng ta có thể sử dụng Spring Boot.
Để sử dụng JPA trong Spring Boot chúng ta cần thêm spring-boot-starter-data-jpa để sử dụng.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
Dependency này đã bao gồm JPA API, JPA implementaton, JDBC và các thư viện cần thiết khác. Spring chọn Hibernate JPA implementation là trình triển khai mặc định của JPA API, vì vậy trong spring-boot-starter-data-jpa đã bao gồm Hibernate JPA implementation.
Cuối cùng chúng ta sẽ sử dụng H2 dependency để thực hành các ví dụ trong bài viết này.
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency>
Khởi tạo Entity
Entity là một ánh xạ tương ứng với một table trong database, do vậy việc đầu tiên chúng ta cần làm là định nghĩa các entity tương ứng với các table đã được thiết kế từ trước.
package com.deft.hibernateintegration.entities; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence.*; @Entity @Table(name = "book") @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; }
Tạo Repository và Service
Tiếp theo, Repository là một trong những component cơ bản tương ứng với một entity được dùng để thao tác với database.
package com.deft.hibernateintegration.repositories; import com.deft.hibernateintegration.entities.Book; import org.springframework.stereotype.Repository; @Repository public interface BookRepository extends JpaRepository<Book, Long> { }
Chúng ta có thể sử dụng JpaRepository interface từ Spring framework để cung cấp triển khai mặc định cho các hoạt động CRUD cơ bản như insert, delete, update.
Tiếp theo, hãy thêm BookService interface vào services package đại diện cho các function có thể có trong BookService.
package com.deft.hibernateintegration.services; import com.deft.hibernateintegration.entities.Book; import java.util.List; public interface BookService { List<Book> findAll(); }
Và một triển khai của BookService.
package com.deft.hibernateintegration.services.impl; import com.deft.hibernateintegration.entities.Book; import com.deft.hibernateintegration.repositories.BookRepository; import com.deft.hibernateintegration.services.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class BookServiceImpl implements BookService { @Autowired private BookRepository bookRepository; @Override public List<Book> findAll() { return bookRepository.findAll(); } }
Như vậy là chúng ta đã hoàn thành các bước cơ bản để tạo và thao tác dữ liệu với Hibernate. Bây giờ, mình sẽ kiểm thử bằng unit-test để xem nó có hoạt động hay không. Lưu ý, H2 chỉ là memory database, nên không cần cấu hình datasoure/
package com.deft.hibernateintegration; import com.deft.hibernateintegration.entities.Book; import com.deft.hibernateintegration.repositories.BookRepository; import com.deft.hibernateintegration.services.BookService; import org.assertj.core.util.Lists; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @SpringBootTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) class HibernateIntegrationApplicationTests { @Autowired private BookService bookService; @Autowired private BookRepository bookRepository; @BeforeAll void setup() { Book book1 = new Book(); Book book2 = new Book(); Book book3 = new Book(); bookRepository.saveAll(Lists.newArrayList(book1, book2, book3)); } @Test void loadTest() { List<Book> books = bookService.findAll(); assertEquals(3, books.size()); } }
JPA – Hibernate kết nối đến database
Nếu muốn kết nối đến database thật, chúng ta cần cấu hình DataSource là các thông tin kết nối đến db như url, username, password. Ngoài ra còn một số cấu hình của JPA như tự động tạo bảng, hiển thị query, etc.
Dưới đây là một application.properties cấu hình cơ bản để kết nối đến MariaDB
Trước tiên, chúng ta cần thêm Mariab denpendency vào file pom. Nếu sử dụng MySQL thì các bạn sẽ phải sử dụng dependency tương ứng hỗ trợ cho MySQL.
<dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>2.7.1</version> </dependency>
Sau đó, tiến hành các bước cấu hình đơn giản. Spring Boot sẽ tự động đọc cấu hình và tạo các kết nối đến database dựa theo những thông tin mà bạn cung cấp.
# =============================== # = DATA SOURCE # =============================== spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/store?useSSL=false spring.datasource.username=root spring.datasource.password=admin # =============================== # = SPRING JPA # =============================== spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect spring.jpa.show-sql=true spring.jpa.generate-ddl=false spring.jpa.properties.hibernate.ddl-auto=none spring.jpa.properties.hibernate.format_sql=true
Để kiểm thử mình sẽ tạo một controller để lấy dữ liệu từ database thông qua tầng service.
package com.deft.hibernateintegration.controllers; import com.deft.hibernateintegration.entities.Book; import com.deft.hibernateintegration.services.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("/book") public class BookController { @Autowired private BookService bookService; @GetMapping public List<Book> findAll() { return bookService.findAll(); } }
Thực hiện truy vấn đến http://localhost:8080/book
curl http://localhost:8080/book ---- [ { "id": 1, "name": null }, { "id": 2, "name": null }, { "id": 3, "name": null } ]
Kết bài
Như vậy chúng ta đã biết được những bước cơ bản nhất để tạo một ứng dụng thao tác với database sử dụng JPA, và Hibernate Implementation trong dự án Spring Boot. Hiện nay, Hibernate là một ORM được sử dụng rất rộng rãi trong các dự án Spring, có nhiều bạn đang hằng ngày làm việc với nó cũng có khi lơ là mà không biết bên dưới JPA là Hibernate.
Mã nguồn được mình công khai trên gitlab để các bạn có thể tiện tham khảo: spring-boot-hibernate
Nguồn tham khảo