Hướng Dẫn Sử Dụng Hibernate Framework

Trong các bài viết trước chúng ta đã cùng tìm hiểu các khái niệm về JPA và Hibernate. Trong bài này, chúng ta sẽ cùng tìm hiểu cách cài đặt và sử dụng Hibernate.

Bạn đang xem: Hướng dẫn sử dụng hibernate framework

Để sử dụng Hibernate, chúng ta sẽ lần lượt thực hiện các bước sau:

Tạo maven project.Khai báo thư viện Hibernate và thư viện JDBC ứng với loại database cần sử dụng.Tạo các Entity và các mapping.Tạo file cấu hình Hibernate.Tạo đối tượng SessionFactorySử dụng SessionFactory để thực hiện các câu lệnh truy vấn đến database.

Cài đặt Hibernate

Tạo maven project và trong file pom.xml khai báo thư viện Hibernate 5, và thư viện JDBC tương ứng cho các loại Database khác nhau MySQL, PostgreSQL, Oracle, SQL Server, …

Trong bài này, tôi sẽ sử dụng database MySQL. Nội dung file pom.xml như sau:

4.0.0com.earlsdaughter.comHibernateTutorial0.0.1-SNAPSHOTjarHibernateTutorialhttp://maven.apache.orgUTF-81.81.8org.projectlomboklombok1.18.10org.hibernatehibernate-core5.4.7.Finalmysqlmysql-connector-java8.0.17junitjunit3.8.1test

Tạo các Entity và các mapping

Tiếp theo chúng ta sẽ tạo các Enity. Mỗi Entity sẽ đại diện cho một bảng trong database.

Giả sử tôi có một table user với cấu trúc như sau:

*

Nội dung file này như sau:

com.mysql.jdbc.Driverjdbc:mysql://localhost:3306/gp_system?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8root4org.hibernate.dialect.MySQL5Dialectthreadorg.hibernate.cache.internal.NoCacheProvidertrue

Tạo đối tượng SessionFactory

Như đã giới thiệu ở bài viết trước, SessionFactory là một interface giúp tạo ra session kết nối đến database bằng cách đọc các cấu hình trong Hibernate configuration.

SessionFactory là đối tượng nặng (heavy weight object) và được sử dụng thường xuyên nên chúng ta sẽ tạo một class singleton HibernateUtils để sử dụng sau này.

HibernateUtils.java

package com.earlsdaughter.com.utils;import org.hibernate.SessionFactory;import org.hibernate.boot.Metadata;import org.hibernate.boot.MetadataSources;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.service.ServiceRegistry;public class HibernateUtils {private static final SessionFactory sessionFactory = buildSessionFactory();private HibernateUtils() {super();}private static SessionFactory buildSessionFactory() {ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() //.configure() // Load hibernate.cfg.xml from resource folder by default.build();Metadata metadata = new MetadataSources(serviceRegistry).getMetadataBuilder().build();return metadata.getSessionFactoryBuilder().build();}public static SessionFactory getSessionFactory() {return sessionFactory;}public static void close() {getSessionFactory().close();}}

Sử dụng SessionFactory để thực hiện các câu lệnh truy vấn đến database

Chúng ta đã chuẩn bị đầy đủ mọi thứ, công việc bây giờ là sử dụng thôi.

Đầu tiên, chúng ta cần mở một session để làm việc với Hibernate:

Session session = HibernateUtils.getSessionFactory().openSession();Để bắt đầu làm việc, chúng ta sẽ mở một Transaction mới:

session.beginTransaction();Truy vấn database: Hibernate hỗ trợ nhiều cách để truy vấn database, trong bài này chúng ta sẽ sử dụng HQL để truy vấn database. HQL có một chút khác biệt với SQL:

SQL: Truy vấn dữ liệu trên các table và column.HQL: Truy vấn dữ liệu trên các entity và property.

Xem thêm: Hướng Dẫn Kiểm Tra Các Dịch Vụ Đang Sử Dụng Vina Phone Nhanh

Sau khi đã sử dụng xong, chúng ta cần gọi commit() để lưu mọi thay đổi xuống database.

session.getTransaction().commit();Ví dụ bên dưới sẽ thực hiện các thao tác: Insert, Update, Delete, Count, Select dữ liệu của database.

package com.earlsdaughter.com;import java.util.Date;import java.util.List;import org.hibernate.Session;import com.earlsdaughter.com.entities.User;import com.earlsdaughter.com.utils.HibernateUtils;public class HibernateExample1 {public static void main(String<> args) {try (Session session = HibernateUtils.getSessionFactory().openSession();) {// Begin a unit of worksession.beginTransaction();// Insert userDate currentDate = new Date();User user1 = new User();user1.setFullname("Hibernate Example");user1.setUsername("earlsdaughter.com");user1.setPassword("123456"); // Should encode passworduser1.setCreatedAt(currentDate);user1.setModifiedAt(currentDate);Long userId = (Long) session.save(user1);System.out.println("User id = " + userId); // Count user from databaseLong numberOfUser = session.createQuery("SELECT COUNT(id) FROM User", Long.class).uniqueResult();System.out.println("Number of user in database: " + numberOfUser);// Get user by idUser savedUser = session.find(User.class, userId);System.out.println("savedUser: " + savedUser);// Update usersavedUser.setFullname("GP Coder");session.update(savedUser);// Get usersList users = session.createQuery("FROM User", User.class).list();users.forEach(System.out::println);// Delete usersession.delete(savedUser);// Count user from databasenumberOfUser = session.createQuery("SELECT COUNT(id) FROM User", Long.class).uniqueResult();System.out.println("Number of user in database: " + numberOfUser);// Commit the current resource transaction, writing any unflushed changes to the database.session.getTransaction().commit();}}}Một số phương thức được sử dụng:

save() : insert một entity vào database. Phương thức này trả về id của record đã được save.update() : cập nhật entity vào database.delete() : xóa entity khỏi database.createQuery() : tạo câu lệnh query đến database.find() : tìm entity dựa vào id được cung cấp.

Chạy chương trình trên, chúng ta có kết quả như sau:

Hibernate: insert into user (created_at, fullname, modified_at, password, username) values (?, ?, ?, ?, ?)User id = 1Hibernate: select count(user0_.id) as col_0_0_ from user user0_Number of user in database: 1savedUser: User(id=1, fullname=Hibernate Example, username=earlsdaughter.com, password=123456, createdAt=Sat Oct 26 00:04:47 ICT 2019, modifiedAt=Sat Oct 26 00:04:47 ICT 2019)Hibernate: update user set created_at=?, fullname=?, modified_at=?, password=?, username=? where id=?Hibernate: select user0_.id as id1_0_, user0_.created_at as created_2_0_, user0_.fullname as fullname3_0_, user0_.modified_at as modified4_0_, user0_.password as password5_0_, user0_.username as username6_0_ from user user0_User(id=1, fullname=GP Coder, username=earlsdaughter.com, password=123456, createdAt=Sat Oct 26 00:04:47 ICT 2019, modifiedAt=Sat Oct 26 00:04:47 ICT 2019)Hibernate: delete from user where id=?Hibernate: select count(user0_.id) as col_0_0_ from user user0_Number of user in database: 0Như các bạn thấy, sử dụng Hibernate việc truy vấn database đơn giản hơn rất nhiều so với sử dụng JDBC API.