Bạn đã bao giờ tự hỏi ORM trong Hibernate hoạt động như thế nào? Hãy cùng khám phá trong bài viết này!
ORM (Object Relational Mapping) là một kỹ thuật lập trình mạnh mẽ cho phép chúng ta ánh xạ các đối tượng trong ngôn ngữ lập trình vào dữ liệu trong cơ sở dữ liệu quan hệ. Với Hibernate, ORM giúp đơn giản hóa việc thao tác và truy cập dữ liệu, giúp việc phát triển ứng dụng trở nên nhanh chóng và hiệu quả hơn. Trong bài viết này, chúng ta sẽ tìm hiểu kỹ về các thành phần quan trọng trong Hibernate và cách chúng hoạt động, cùng với một ví dụ cụ thể.
Các Thành Phần Cơ Bản Trong Hibernate
1. Annotation
Để sử dụng Hibernate hiệu quả, trước tiên chúng ta cần hiểu về các Annotation như @Entity
, @Table
, @Column
,... Những chú thích này là siêu dữ liệu trong Java, giúp định nghĩa cấu trúc của các đối tượng và ánh xạ chúng vào các bảng trong cơ sở dữ liệu.
java
@Entity
@Table(name = "user")
@Data
public class UserModel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotEmpty
@Column(name = "username")
private String username;
@NotEmpty
@Column(name = "password")
private String password;
@NotEmpty
@Column(name = "createdDate")
private Date createdDate;
}
2. Reflection
Reflection là một kỹ thuật mạnh mẽ cho phép chúng ta khám phá và thao tác với các thuộc tính của lớp trong thời gian chạy. Nó cho phép chúng ta đọc các Annotation và thay đổi giá trị của các biến, phương thức trong lớp mà không cần biết trước kiến trúc của chúng.
Xây Dựng Một ORM Đơn Giản
Sau khi nắm được các khái niệm cần thiết, chúng ta sẽ triển khai một ORM đơn giản. Đầu tiên, hãy tạo ra các Annotation cần thiết.
Tạo Annotation cho Cột
java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Column {
String columnName();
}
Tạo Annotation cho Bảng
java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Table {
String tableName();
}
Tạo Model Để Làm Việc Với ORM
java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(tableName = "user")
public class User {
@Column(columnName = "usr")
String username;
@Column(columnName = "pwd")
String password;
}
Cài Đặt Simple ORM DAO
java
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class SimpleOrmDao<T> {
private Connection getConnection() throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/simple_orm", "root", "password");
}
List<T> getAllUserAsOrm(Class<T> clazz) throws SQLException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
List<T> userList = new ArrayList<>();
Connection connection = getConnection();
String tableName = clazz.getAnnotation(Table.class).tableName();
ResultSet resultSet = connection.prepareStatement("SELECT * FROM " + tableName).executeQuery();
while (resultSet.next()){
T user = clazz.getConstructor().newInstance();
for (Field field : clazz.getDeclaredFields()) {
if(field.isAnnotationPresent(Column.class)){
String columnName = field.getAnnotation(Column.class).columnName();
if(field.getType() == String.class){
field.set(user, resultSet.getString(columnName));
}
}
}
userList.add(user);
}
return userList;
}
}
Chạy Ứng Dụng
java
public class Main {
public static void main(String[] args) throws ClassNotFoundException, SQLException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
SimpleOrmDao simpleOrmDao = new SimpleOrmDao();
System.out.println(simpleOrmDao.getAllUserAsOrm(User.class));
}
}
Kết quả từ chương trình sẽ tương tự như những gì Hibernate cung cấp cho chúng ta. Như vậy, bài viết đã giới thiệu cho bạn những kiến thức cơ bản về ORM trong Hibernate và cách xây dựng một ORM đơn giản. Hy vọng bạn sẽ tìm thấy thông tin hữu ích trong bài viết này và hẹn gặp lại trong các bài viết tiếp theo!
source: viblo