Hibernate 有哪些实用例子?新手怎么上手用?

文章导读
上一个 测验 下一个 现在让我们通过一个示例来理解如何在独立应用程序中使用 Hibernate 提供 Java 持久化。我们将逐步了解使用 Hibernate 技术创建 Java 应用程序的各个步骤。
📋 目录
  1. A 创建 POJO 类
  2. B 创建数据库表
  3. C 创建映射配置文件
  4. D 创建应用程序类
  5. E 编译和执行
A A

Hibernate - 示例



上一个
测验
下一个

现在让我们通过一个示例来理解如何在独立应用程序中使用 Hibernate 提供 Java 持久化。我们将逐步了解使用 Hibernate 技术创建 Java 应用程序的各个步骤。

创建 POJO 类

创建应用程序的第一步是构建 Java POJO 类或类集合,具体取决于将持久化到数据库的应用程序。让我们考虑我们的 Employee 类,它具有 getXXXsetXXX 方法,使其符合 JavaBeans 规范。

POJO(Plain Old Java Object,普通旧 Java 对象)是一个不扩展或实现 EJB 框架所需特定类和接口的 Java 对象。所有普通的 Java 对象都是 POJO。

当您设计一个将被 Hibernate 持久化的类时,重要的是提供符合 JavaBeans 规范的代码,并包含一个用作索引的属性,例如 Employee 类中的 id 属性。

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;
   }
}

创建数据库表

第二步是在您的数据库中创建表。每个您希望提供持久化的对象将对应一张表。假设上述对象需要存储和检索到以下 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)
);

创建映射配置文件

这一步是创建一个映射文件,指示 Hibernate 如何将定义的 class 或 classes 映射到数据库表。

<?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">
         这个 class 包含员工详细信息。 
      </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>

你应该将映射文档保存为格式为 <classname>.hbm.xml 的文件。我们将映射文档保存为文件 Employee.hbm.xml。让我们来看一下映射文档的详细说明 −

  • 映射文档是一个 XML 文档,以 <hibernate-mapping> 作为根元素,包含所有的 <class> 元素。

  • <class> 元素用于定义从 Java classes 到数据库表的特定映射。Java class 名称使用 class 元素的 name 属性指定,数据库表名称使用 table 属性指定。

  • <meta> 元素是可选元素,可用于创建 class 描述。

  • <id> 元素将 class 中的唯一 ID 属性映射到数据库表的主键。id 元素的 name 属性引用 class 中的属性,column 属性引用数据库表中的列。type 属性包含 Hibernate 映射类型,此映射类型将从 Java 数据类型转换为 SQL 数据类型。

  • id 元素内的 <generator> 元素用于自动生成主键值。generator 元素的 class 属性设置为 native,让 Hibernate 根据底层数据库的能力选择 identity, sequencehilo 算法来创建主键。

  • <property> 元素用于将 Java class 属性映射到数据库表中的列。元素的 name 属性引用 class 中的属性,column 属性引用数据库表中的列。type 属性包含 Hibernate 映射类型,此映射类型将从 Java 数据类型转换为 SQL 数据类型。

还有其他可用的属性和元素,这些将在映射文档中使用,我会在讨论其他 Hibernate 相关主题时尽量覆盖尽可能多的内容。

创建应用程序类

最后,我们将创建带有 main() 方法的应用程序类来运行应用程序。我们将使用此应用程序保存几条 Employee 记录,然后对这些记录执行 CRUD 操作。

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();

      /* 在数据库中添加几条员工记录 */
      Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
      Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
      Integer empID3 = ME.addEmployee("John", "Paul", 10000);

      /* 列出所有员工 */
      ME.listEmployees();

      /* 更新员工记录 */
      ME.updateEmployee(empID1, 5000);

      /* 从数据库中删除一名员工 */
      ME.deleteEmployee(empID2);

      /* 列出新的员工列表 */
      ME.listEmployees();
   }
   
   /* 在数据库中 CREATE 一名员工的方法 */
   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;
   }
   
   /* READ 所有员工的方法 */
   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(); 
      }
   }
   
   /* UPDATE 一名员工薪资的方法 */
   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(); 
      }
   }
   
   /* 从记录中 DELETE 一名员工的方法 */
   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(); 
      }
   }
}

编译和执行

以下是编译并运行上述应用程序的步骤。请确保在进行编译和执行之前,已正确设置 PATH 和 CLASSPATH。

  • 按照配置章节的说明创建 hibernate.cfg.xml 配置文件。

  • 按照上述示例创建 Employee.hbm.xml 映射文件。

  • 按照上述示例创建 Employee.java 源文件并编译它。

  • 按照上述示例创建 ManageEmployee.java 源文件并编译它。

  • 执行 ManageEmployee 可执行文件以运行程序。

输出

你将看到以下结果,并且 EMPLOYEE 表中将创建记录。

$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

如果你检查 EMPLOYEE 表,它应该包含以下记录 −

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>