Hibernate, như mình nói trong bài viết này, ngoài hiện thực JPA specification, nó còn hiện thực riêng một framework của riêng nó để kết nối và thao tác với các hệ quản trị cơ sở dữ liệu. Trong bài viết đầu tiên này về Hibernate, mình sẽ đi thẳng vào một ví dụ sử dụng Hibernate để lấy dữ liệu từ database lên cho các bạn dễ hình dung về Hibernate và cách làm việc của nó. Sự khác nhau so với phần hiện thực của Hibernate cho JPA như thế nào?
OK, đầu tiên mình sẽ tạo một Maven project để làm ví dụ:
Trong đó, Hibernate dependency như sau:
1 2 3 4 5 |
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.12.Final</version> </dependency> |
Trong bài viết này, mình sẽ sử dụng MySQL database nên mình cũng sẽ thêm MySQL Driver dependency như sau:
1 2 3 4 5 |
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> |
Project Lombok:
1 2 3 4 5 6 |
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency> |
Trong ví dụ này, mình sẽ định nghĩa một database chứa thông tin của lớp học và những sinh viên của lớp học đó như sau:
1 2 3 4 5 |
CREATE TABLE `clazz` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
1 2 3 4 5 6 7 8 9 10 11 |
CREATE TABLE `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `code` varchar(10) NOT NULL, `date_of_birth` datetime DEFAULT NULL, `email` varchar(100) DEFAULT NULL, `clazz_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `student_clazz_idx` (`clazz_id`), CONSTRAINT `student_clazz` FOREIGN KEY (`clazz_id`) REFERENCES `clazz` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
Các bước chuẩn bị đã xong, giờ chúng ta bắt đầu đi vào phần chính nhé các bạn.
Đầu tiên, để có thể thao tác với các bảng clazz và students trong database, chúng ta sẽ ánh xạ các bảng, các cột của những table này qua thành những Java object trước (ORM). Hibernate với framework của chính mình cũng sử dụng khái niệm gọi là entity như trong JPA nha các bạn!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package com.huongdanjava.hibernate; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity @Table @Getter @Setter public class Students { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String name; @Column private String code; @Column(name = "date_of_birth") private Date dateOfBirth; @Column private String email; @Column(name = "clazz_id") private Long clazzId; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.huongdanjava.hibernate; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity @Table @Getter @Setter public class Clazz { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String name; } |
Tiếp theo, để làm việc với Hibernate chúng ta cần phải có một tập tin cấu hình. Trong tập tin này chúng ta sẽ khai báo loại database mà chúng ta sẽ sử dụng, những thông tin cần thiết để Hibernate có thể kết nối đến database đó và những Java object mà chúng ta đã ánh xạ từ các bảng trong database.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://localhost:3306/hibernateexample</property> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <mapping class="com.huongdanjava.hibernate.Clazz"/> <mapping class="com.huongdanjava.hibernate.Students"/> </session-factory> </hibernate-configuration> |
Như các bạn thấy, thông tin về database, username, password và thông tin về những Java object được khai báo rất chi tiết trong tập tin cấu hình của Hibernate. Ngoài ra, chúng ta còn có thể khai báo thêm những thông tin khác như hiển thị câu lệnh SQL, định dạng câu lệnh SQL, … Mình sẽ nói kỹ hơn về những cái này trong những bài viết tiếp theo về Hibernate nha các bạn.
Thông thường, chúng ta đặt tập tin cấu hình của Hibernate trong thư mục /src/main/resources/ của project.
OK, chúng ta đã có tập tin cấu hình, vậy giờ làm thế nào để đưa những cấu hình đó vào để sử dụng trong project của chúng ta?
Hibernate hỗ trợ chúng ta làm điều đó bằng cách sử dụng đối tượng Configuration để đưa cấu hình của chúng ta vào một đối tượng hiện thực interface SessionFactory.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.huongdanjava.hibernate; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory SESSION_FACTORY = new Configuration().configure().buildSessionFactory(); public static SessionFactory getSessionFactory() { return SESSION_FACTORY; } } |
Và giờ chúng ta có thể sử dụng đối tượng SessionFactory để sử dụng trong ứng dụng của chúng ta rồi.
Đầu tiên, chúng ta cần mở một session để làm việc với Hibernate bằng cách:
1 |
Session session = HibernateUtil.getSessionFactory().openSession(); |
Để bắt đầu làm việc, chúng ta sẽ mở một Transaction mới:
1 |
session.beginTransaction(); |
Ví dụ để thêm mới một lớp, chúng ta sẽ khởi tạo mới đối tượng Clazz,
1 |
Clazz clazz = new Clazz(); |
Thêm tên gọi cho đối tượng Clazz này:
1 |
clazz.setName("ABC"); |
Và ngay bây giờ các bạn có thể dùng đối tượng Session để lưu đối tượng Clazz trên vào database.
1 2 |
session.save(clazz); session.getTransaction().commit(); |
Rất đơn giản phải không các bạn, để kiểm tra có thật sự đối tượng Clazz của chúng ta đã được lưu vào database hay chưa? Các bạn có thể code tiếp:
1 2 3 4 5 6 |
Query<Clazz> q = session.createQuery("From Clazz "); List<Clazz> resultList = q.list(); for (Clazz next : resultList) { System.out.println("Clazz name: " + next.getName()); } |
Toàn bộ code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package com.huongdanjava.hibernate; import org.hibernate.Session; import org.hibernate.query.Query; import java.util.List; public class Application { public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Clazz clazz = new Clazz(); clazz.setName("ABC"); session.save(clazz); session.getTransaction().commit(); Query<Clazz> q = session.createQuery("From Clazz "); List<Clazz> resultList = q.list(); for (Clazz next : resultList) { System.out.println("Clazz name: " + next.getName()); } } } |
Kết quả:
OK, đến đây chắc các bạn đã có những hình dung ban đầu về cách mà chúng ta sẽ làm việc với Hibernate như thế nào, phải không các bạn? Trong bài viết kế tiếp mình sẽ nói rõ thêm một số khái niệm cơ bản để các bạn nắm kỹ hơn nhé.
Phong
java-core > Java with SQL Lập trình JDBC > JPA-API > hibernate > Spring boot theo thứ tự nhé các bác
chuối
a k hướng dẫn tạo ra cái file entity gì kia ạ, a ghi như trong jpa nhưng e chưa biết gì jpa thì tạo ntn ạ
Cường
anh oi cho em hỏi phần định nghĩa database viết trong mySQL ạ
Khanh Nguyen
Là sao em nhỉ?