Hibernate 简单示例

现在让我们举个例子来了解如何使用 Hibernate 在独立应用程序中提供 Java 持久性。我们将介绍使用 Hibernate 技术创建 Java 应用程序所涉及的不同步骤。

创建 POJO 类

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

POJO (Plain Old Java Object) 是一个 Java 对象,它不扩展或实现 EJB 框架分别需要的一些专门的类和接口。 所有普通的 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 如何将定义的一个或多个类映射到数据库表。

<?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>

我们应该将映射文档保存在格式为 <classname>.hbm.xml 的文件中。 我们将映射文档保存在文件 Employee.hbm.xml 中。 让我们看看有关映射文档的一些细节

  • 映射文档是一个以 <hibernate-mapping> 作为根元素的 XML 文档,它包含所有 <class> 元素。
  • <class> 元素用于定义从 Java 类到数据库表的特定映射。 Java 类名使用 class 元素的 name 属性指定,数据库表名使用 table 属性指定。
  • <meta> 元素是可选元素,可用于创建类描述。
  • <id> 元素将类中的唯一 ID 属性映射到数据库表的主键。 id 元素的 name 属性指的是类中的属性,column 属性指的是数据库表中的列。 type 属性保存hibernate 映射类型,这种映射类型将从Java 转换为SQL 数据类型。
  • id 元素中的 <generator> 元素用于自动生成主键值。生成器元素的 class 属性设置为 native 以让 hibernate 选择身份、序列或 hilo 算法来根据底层数据库的功能创建主键。
  • <property> 元素用于将 Java 类属性映射到数据库表中的列。元素的名称属性是指类中的属性,列属性是指数据库表中的列。 type 属性保存hibernate 映射类型,这种映射类型将从Java 转换为SQL 数据类型。

还有其他可用的属性和元素,它们将在映射文档中使用,在讨论其他 Hibernate 相关主题时,我们将尝试涵盖尽可能多的内容。


创建应用程序类

最后,我们将使用 main() 方法创建我们的应用程序类来运行应用程序。 我们将使用这个应用程序来保存一些员工的记录,然后我们将对这些记录应用 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);

      /* Delete an employee from the database */
      ME.deleteEmployee(empID2);

      /* 列出新的员工名单 */
      ME.listEmployees();
   }
   
   /* 在数据库中创建员工的方法 */
   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;
   }
   
   /* 读取所有员工的方法 */
   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(); 
      }
   }
   
   /* 更新员工的薪水 */
   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(); 
      }
   }
   
   /* 从记录中删除员工的方法 */
   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

查看笔记

扫码一下
查看教程更方便