icantech
Lập trình chung
1386
28/11/2023

Hibernate là gì? Hướng dẫn tạo ứng dụng Java với Hibernate

Nếu là một người đang học hoặc thường xuyên sử dụng ngôn ngữ Java, chắc chắn bạn đã nghe đến thuật ngữ Hibernate. Hibernate là công cụ hỗ trợ các phần mềm được xây dựng và phát triển từ Java. Tuy nhiên, không phải ai cũng hiểu rõ khái niệm Hibernate là gì, ưu điểm và cách sử dụng Hibernate trong Java. ICANTECH giúp bạn có thể hiểu và tận dụng tối đa công dụng của Hibernate thông qua bài viết này.

1. Tổng quan Hibernate 

Ở phần đầu tiên của bài viết, chúng ta sẽ cùng nhau tìm hiểu tổng quan Hibernate là gì hay Java Hibernate là gì.

1.1. Hibernate là gì?

Hibernate là một framework ORM (Object-Relational Mapping) hiệu suất cao được để lưu các đối tượng trong Java vào hệ thống cơ sở dữ liệu. Hibernate cung cấp các tác vụ như truy vấn cho các thao tác CRUD (Create, Read, Update, Delete), hay thiết lập kết nối đến cơ sở dữ liệu…

hibernate-la-gi

Hibernate giúp phát triển logic bền vững, lưu trữ và xử lý dữ liệu để sử dụng được lâu hơn. Hibernate rất nhẹ và đặc biệt là có mã nguồn mở - đây là lợi thế của nó so với các framework khác.

1.2. Các thành phần của hibernate

Hibernate có 3 thành phần cơ bản khác nhau, đó là:

  • Entities (thực thể): là các lớp Java đơn giản được hibernate map tới các bảng cơ sở dữ liệu quan hệ (relational database).
  • Configuration Metadata: chứa thông tin về cách map các thực thể vào các bảng cơ sở dữ liệu quan hệ. Java cung cấp phương thức chú thích, hibernate cung cấp tệp cấu hình dựa trên XML.
  • Hibernate Query Language (HQL): các truy vấn gửi đến cơ sở dữ liệu ở chế độ hibernate có thể được tạo bằng Native SQL hoặc ngôn ngữ truy vấn riêng của hibernate. Các truy vấn này được dịch trong thời gian chạy sang phương ngữ đang được sử dụng.

1.3. Ưu điểm của Hibernate

Dưới đây là một số ưu điểm nổi bật của Hibernate:

  • Hibernate xử lý tất cả công việc map các lớp java tới các bảng cơ sở dữ liệu bằng cách sử dụng cấu hình XML mà không cần bạn viết bất kỳ dòng code nào.
  • Cung cấp API để lưu trữ và truy xuất đến các đối tượng trực tiếp từ cơ sở dữ liệu.
  • Nếu có sự thay đổi trong cơ sở dữ liệu hoặc trong bất kỳ bảng nào, bạn chỉ cần thay đổi trong tệp cấu hình XML là xong.
  • Hibernate không yêu cầu 1 ứng dụng máy chủ để hoạt động.
  • Giảm thiểu việc truy cập vào cơ sở dữ liệu bằng chiến lược tìm nạp thông minh.
  • Cung cấp khả năng truy vấn dữ liệu đơn giản.

2. Hướng dẫn tạo ứng dụng Java với Hibernate

Sau khi đã cùng tìm hiểu Hibernate là gì, tiếp theo chúng ta sẽ làm một ví dụ để hiểu cách sử dụng Hibernate. ICANTECH sẽ hướng dẫn bạn từng bước thực hiện để có thể tạo 1 ứng dụng Java với Hibernate.

2.1. Tạo các lớp POJO

Bước đầu tiên bạn cần làm là xây dựng lớp hoặc các lớp Java POJO (Plain Old Java Object) dựa vào ứng dụng sẽ được lưu vào cơ sở dữ liệu. Dưới đây là ví dụ cách tạo lớp Employee bằng các phương thức getXXX và setXXX và trở thành lớp tuân thủ JavaBeans.

public class Employee {

    private int id;

    private String firstName; 

    private String lastName;   

    private int salary;  

    public Employee() {}

    public Employee(String fname, String lname, int salary) {

       this.firstName = fname;

       this.lastName = lname;

       this.salary = salary;

    }

    public int getId() {

       return id;

    }   

    public void setId( int id ) {

       this.id = id;

    }

    public String getFirstName() {

       return firstName;

    }

       public void setFirstName( String first_name ) {

       this.firstName = first_name;

    }   

    public String getLastName() {

       return lastName;

    }   

    public void setLastName( String last_name ) {

       this.lastName = last_name;

    }

    public int getSalary() {

       return salary;

    }

    public void setSalary( int salary ) {

       this.salary = salary;

    }

}

2.2. Tạo bảng cơ sở dữ liệu

Bước thứ hai bạn cần làm là tạo bảng trong cơ sở dữ liệu tương ứng với từng đối tượng. Hãy xem ví dụ các đối tượng ở phần trên cần được lưu trữ và truy xuất vào bảng RDBMS: 

create table EMPLOYEE (

    id INT NOT NULL auto_increment,

    first_name VARCHAR(20) default NULL,

    last_name  VARCHAR(20) default NULL,

    salary     INT  default NULL,

    PRIMARY KEY (id)

);

2.3. Tạo tệp cấu hình map

Bạn tạo một tệp map để hướng dẫn Hibernate cách map lớp vào các bảng cơ sở dữ liệu. Bạn nên lưu tài liệu map vào một tệp có định dạng <classname>.hbm.xml. 

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

<!DOCTYPE hibernate-mapping PUBLIC 

"-//Hibernate/Hibernate Mapping DTD//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>

    <class name = "Employee" table = "EMPLOYEE">

       <meta attribute = "class-description">

          This class contains the employee detail. 

       </meta>

       <id name = "id" type = "int" column = "id">

          <generator class="native"/>

       </id>

       <property name = "firstName" column = "first_name" type = "string"/>

       <property name = "lastName" column = "last_name" type = "string"/>

       <property name = "salary" column = "salary" type = "int"/>

    </class>

</hibernate-mapping>

2.4. Tạo lớp ứng dụng

Cuối cùng để chạy ứng dụng, bạn cần tạo lớp ứng dụng bằng phương thức main(). Dưới đây là ví dụ cách sử dụng ứng dụng để lưu hồ sơ đồng thời áp dụng các thao tác CRUD trên các hồ sơ đó.

import java.util.List; 

import java.util.Date;

import java.util.Iterator; 

import org.hibernate.HibernateException; 

import org.hibernate.Session; 

import org.hibernate.Transaction;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class ManageEmployee {

   private static SessionFactory factory; 

   public static void main(String[] args) 

      try {

         factory = new Configuration().configure().buildSessionFactory();

      } catch (Throwable ex) { 

         System.err.println("Failed to create sessionFactory object." + ex);

         throw new ExceptionInInitializerError(ex); 

      }

      ManageEmployee ME = new ManageEmployee();

      /* Add few employee records in database */

      Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);

      Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);

      Integer empID3 = ME.addEmployee("John", "Paul", 10000);

      /* List down all the employees */

      ME.listEmployees();

      /* Update employee's records */

      ME.updateEmployee(empID1, 5000);

      /* Delete an employee from the database */

      ME.deleteEmployee(empID2);

      /* List down new list of the employees */

      ME.listEmployees();

   }   

   /* Method to CREATE an employee in the database */

   public Integer addEmployee(String fname, String lname, int salary){

      Session session = factory.openSession();

      Transaction tx = null;

      Integer employeeID = null;      

      try {

         tx = session.beginTransaction();

         Employee employee = new Employee(fname, lname, salary);

         employeeID = (Integer) session.save(employee); 

         tx.commit();

      } catch (HibernateException e) {

         if (tx!=null) tx.rollback();

         e.printStackTrace(); 

      } finally {

         session.close(); 

      }

      return employeeID;

   }

   /* Method to  READ all the employees */

   public void listEmployees( ){

      Session session = factory.openSession();

      Transaction tx = null;

      try {

         tx = session.beginTransaction();

         List employees = session.createQuery("FROM Employee").list(); 

         for (Iterator iterator = employees.iterator(); iterator.hasNext();){

            Employee employee = (Employee) iterator.next(); 

            System.out.print("First Name: " + employee.getFirstName()); 

            System.out.print("  Last Name: " + employee.getLastName()); 

            System.out.println("  Salary: " + employee.getSalary()); 

         }

         tx.commit();

      } catch (HibernateException e) {

         if (tx!=null) tx.rollback();

         e.printStackTrace(); 

      } finally {

         session.close(); 

      }

   }

   /* Method to UPDATE salary for an employee */

   public void updateEmployee(Integer EmployeeID, int salary ){

      Session session = factory.openSession();

      Transaction tx = null;

      try {

         tx = session.beginTransaction();

         Employee employee = (Employee)session.get(Employee.class, EmployeeID); 

         employee.setSalary( salary );

session.update(employee); 

         tx.commit();

      } catch (HibernateException e) {

         if (tx!=null) tx.rollback();

         e.printStackTrace(); 

      } finally {

         session.close(); 

      }

   }   

   /* Method to DELETE an employee from the records */

   public void deleteEmployee(Integer EmployeeID){

      Session session = factory.openSession();

      Transaction tx = null;

      try {

         tx = session.beginTransaction();

         Employee employee = (Employee)session.get(Employee.class, EmployeeID); 

         session.delete(employee); 

         tx.commit();

      } catch (HibernateException e) {

         if (tx!=null) tx.rollback();

         e.printStackTrace(); 

      } finally {

         session.close(); 

      }

   }

}

2.5. Biên dịch và thực thi

Để thực hiện biên dịch và chạy ứng dụng đã được tạo ở trên, bạn thực hiện các bước dưới đây:

  • Tạo tệp cấu hình hibernate.cfg.xml
  • Tạo tệp map Employee.hbm.xml 
  • Tạo tệp nguồn Staff.java và biên dịch nó
  • Tạo tệp nguồn ManaEmployee.java và biên dịch nó
  • Thực thi ManaEmployee để chạy chương trình.

Bạn sẽ nhận được kết quả và các bản ghi sẽ được tạo trong bảng Employee như sau:

$java ManageEmployee

.......VARIOUS LOG MESSAGES WILL DISPLAY HERE.....…

First Name: Zara  Last Name: Ali  Salary: 1000

First Name: Daisy  Last Name: Das  Salary: 5000

First Name: John  Last Name: Paul  Salary: 10000

First Name: Zara  Last Name: Ali  Salary: 5000

First Name: John  Last Name: Paul  Salary: 10000

Khi bạn kiểm tra bảng Employee của mình sẽ có các bản ghi sau:

mysql> select * from EMPLOYEE;

+----+------------+-----------+--------+

| id | first_name | last_name | salary |

+----+------------+-----------+--------+

| 29 | Zara       | Ali       |   5000 |

| 31 | John       | Paul      |  10000 |

+----+------------+-----------+--------+

2 rows in set (0.00 sec

mysql>

3. Lời Kết

Bài viết trên đây là toàn bộ thông tin bạn cần biết về Hibernate là gì và những ưu điểm của công cụ này. Bên cạnh đó, thông qua bài viết, ICANTECH đã hướng dẫn bạn cách tạo ứng dụng Java với Hibernate đơn giản, dễ hiểu. 

Mong rằng với những thông tin mà ICANTECH chia sẻ, bạn đã có thêm kiến thức và kinh nghiệm để áp dụng vào học tập cũng như công việc của mình. 

Cảm ơn bạn đã đọc bài viết, nếu bạn đang quan tâm đến học lập trình thì hãy tham khảo ngay các khóa học lập trình dưới đây tại ICANTECH nhé!

Nguồn ảnh: ICANTECH.

Share
Tags
Lập trình chung

Bài tương tự