Java my...

Hibernate教程(一)---Hibernate简介

2017-12-20  本文已影响0人  ferdinand_hx

Hibernate简介

Hibernate-position

Hibernate的优势

Hibernate支持的数据库

Hibernate几乎支持所有的关系型数据库管理系统(RDBMS),支持的数据库如下所示:

Hibernate架构

Hibernate架构是分层的,所以我们不需要知道底层的API,Hibernate利用数据库和配置数据向我们的应用程序提供持久性服务(和持久性对象)。

下图是Hibernate应用结构体系简要视图:


Hibernate-hign-level

下图是Hibernate应用结构体系详细视图,包含了几个重要的核心类:


Hibernate架构

JDBC提供了关系数据库通用的功能抽象层,所有具有JDBC驱动程序的数据库都被Hibernate支持。
JTAJNDI允许Hibernate与J2EE服务器集成。

Hibernate应用结构体系主要类对象

Configuration Object

Configuration Object是我们在Hibernate应用程序中创建的第一个Hibernate对象,通常在应用程序初始化时且只创建一次。它是Hibernate所需要的配置和属性文件。Configuration对象提供两个关键组件:

SessionFactory Object

Configuration Object用于创建一个SessionFactory Obejct,该对象使用提供的配置文件为应用程序配置Hibernate,并允许实例化一个Session对象。SessionFactory线程安全对象,供应用程序的所有线程使用。

SessionFactory是重量级对象。因此通常在应用程序启动期间创建并保留供以后使用。

每个数据库都需要使用一个单独的配置文件创建一个SessionFactory对象。如果使用多个数据库,则必须创建多个SessionFactory对象。

Session(会话) Object

Session(会话)用于获取与数据库的物理连接,Session对象是轻量级的,并且是每当需要与数据库进行交互时才会被实例化。持久化对象通过Session对象进行保存和检索。

Session对象不应该长时间保持打开,因为他们通常不是线程安全的,所以应该根据业务需求创建和销毁它们。

Transaction(事务) Object

事务Transaction代表与数据库的工作单元,大多数关系型数据库都支持事务功能。Hibernate中的事务由底层事务管理器和事务(来自JDBC和JTA)处理。

这是一个可选对象,Hibernate应用程序可以选择不使用此接口,而选择在自己的应用程序代码中管理事务。

Query Object

查询Query对象使用SQL或者Hibernate查询语言(Hibernate Query Language,HQL)字符串从数据库检索数据并创建对象。Query实例用于绑定查询参数,限制查询返回的结果数量,最后执行查询。

Criteria Object

条件对象用于创建和执行面向对象的标准查询以检索对象。

Hibernate 环境配置

该章主要介绍如何安装Hibernate以及其它相关包来为Hibernate应用程序准备一个开发环境。本文将使用Mysql数据库来演示Hibernate实例。

Hibernate下载

安装Hibernate

下载完Hibernate之后,只需要执行以下两个简单的步骤即可。请确保正确的配置了CLASSPATH环境变量,否则在编译应用程序时会出现问题。

Hibernate的依赖包

S.N. Packages/Libraries
1 dom4j - XML parsing www.dom4j.org/
2 Xalan - XSLT Processor http://xml.apache.org/xalan-j/
3 Xerces - The Xerces Java Parser http://xml.apache.org/xerces-j/
4 cglib - Appropriate changes to Java classes at runtime http://cglib.sourceforge.net/
5 log4j - Logging Faremwork http://logging.apache.org/log4j
6 Commons - Logging, Email etc. http://jakarta.apache.org/commons
7 SLF4J - Logging Facade for Java http://www.slf4j.org

Hibernate配置

Hibernate需要提前知道在哪里可以找到定义的Java类和数据库表相关联的映射信息。Hibernate还需要一组与数据库和其它相关参数相关的配置设置。所有这些信息通常作为标准java属性文件hibernate.properties或者名为hibernate.cfg.xml的XML文件提供。

Hibernate属性

以下是在独立情况下为一个数据库配置所需要的重要属性列表:

S.N. Properties and Description
1 hibernate.dialect:此属性使Hibernate为选定的数据库生成适当的SQL
2 hibernate.connection.driver_class:JDBC驱动程序类
3 hibernate.connection.url:数据库实例的JDBC URL
4 hibernate.connection.username:数据库用户名
5 hibernate.connection.password:数据库密码
6 hibernate.connection.pool_size:限制在Hibernate数据库连接池中的等待连接数
7 hibernate.connection.autocommit:允许JDBC连接自动提交

如果随着应用服务器和JNDI使用同一个服务器,则还需要配置以下属性:

S.N. Properties and Description
1 hibernate.connection.datasource:在应用服务器中定义的JNDI名称
2 hibernate.jndi.class:JNDI的InitialContext类
3 hibernate.jndi.<JNDIpropertyname>:
4 hibernate.jndi.url:提供JNDI的url
5 hibernate.connection.username:数据库用户名
6 hibernate.connection.password:数据库密码

Hibernate和Mysql数据库

MySQL是目前最流行的开源数据库系统之一,下面我们创建一个hibernate.cfg.xml配置文件,并将其放置于应用程序类路径的根目录下,必须确保已经安装MySQL 并保证已经保证创建了可用的测试数据库。
XML配置文件必须符合Hibernate 3 Configuration DTD,该文件可从http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd获得。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
   <property name="hibernate.dialect">
      org.hibernate.dialect.MySQLDialect
   </property>
   <property name="hibernate.connection.driver_class">
      com.mysql.jdbc.Driver
   </property>

   <!-- Assume test is the database name -->
   <property name="hibernate.connection.url">
      jdbc:mysql://localhost/test
   </property>
   <property name="hibernate.connection.username">
      root
   </property>
   <property name="hibernate.connection.password">
      root123
   </property>

   <!-- List of XML mapping files -->
   <mapping resource="Employee.hbm.xml"/>

</session-factory>
</hibernate-configuration>

下表是各类数据库的属性类型(Dialect Property)列表:

Database Dialect Property
DB2 org.hibernate.dialect.DB2Dialect
HSQLDB org.hibernate.dialect.HSQLDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Informix org.hibernate.dialect.InformixDialect
Ingres org.hibernate.dialect.IngresDialect
Interbase org.hibernate.dialect.InterbaseDialect
Microsoft SQL Server 2000 org.hibernate.dialect.SQLServerDialect
Microsoft SQL Server 2005 org.hibernate.dialect.SQLServer2005Dialect
Microsoft SQL Server 2008 org.hibernate.dialect.SQLServer2008Dialect
MySQL org.hibernate.dialect.MySQLDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 11g org.hibernate.dialect.Oracle10gDialect
Oracle 10g org.hibernate.dialect.Oracle10gDialect
Oracle 9i org.hibernate.dialect.Oracle9iDialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
Progress org.hibernate.dialect.ProgressDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect

Hibernate实例

创建POJO类

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

创建数据库表

第二步,我们需要在数据库中创建一张表,将表对应我们需要持久化的每一个对象,根据上面的java类我们创建下面这样一个表“

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

创建应用类(java class)

完成了以上步骤后,我们来创建一个应用文件来测试一下我们的配置。

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

      /* 添加一些employee对象到数据库表中*/
      Integer empID1 = ME.addEmployee("Zara", "Ali", 1000);
      Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);
      Integer empID3 = ME.addEmployee("John", "Paul", 10000);

      /* 列出所有employee对象 */
      ME.listEmployees();

      /* 修改 */
      ME.updateEmployee(empID1, 5000);

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

      /* 列出所有对象s */
      ME.listEmployees();
   }
   /* 向数据库中添加employee对象的方法 */
   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;
   }
   /* 列出所有employee对象的方法 */
   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(); 
      }
   }
   /* 修改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(); 
      }
   }
   /* 删除employee对象的方法 */
   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(); 
      }
   }
}

编译和执行

编译和执行的步骤(请确保正确配置了环境变量):

上一篇下一篇

猜你喜欢

热点阅读