在上篇博客中,我们介绍了《hibernate基本概念和体系结构》,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基本配置。核心API的底层实现和源码解析将在以后的博客中一一为大家讲解。

首先我们一起来看一下开发一个hibernate应用程序的大体流程是什么样的(流程顺序可以颠倒):

创建Hibernate的配置文件

创建持久化类

创建对象-关系映射文件

通过Hibernate API编写访问数据库的代码

 


 

     知道了开发流程,那么我们就开始我们的第一hibernate应用程序,首先我们以一个简单的学生管理应用程序来作为我们第一hibernate应用程序的开发,让大家熟悉一下hibernate的开发流程,以及对相对应功能的API有初步的认识,Hibernate应用程序定义了一些持久类,并且定义了这些类与数据库表格的映射关系。在我们这个简单的学生管理应用程序中包含了一个类和一个映射文件。让我们看看这个简单的持久类包含有一些什么?映射文件是怎样定义的?另外,我们该怎样用Hibernate来操作这个持久类。

Hibernate开发全面流程和开发配置

首先创建一个项目。然后创建配置开发环境,主要步骤如下:

MyEclipse-->ProjectCapabilities-->add Hibernate Capabilities,视图如下:

                             

复选框选中第二个copychecke。。。。那一个。然后点击next;

                              

为了锻炼能力,配置文件第一次手写,不用图形界面自动生成,所以把: Open configurationfile after wizard completion 选中的点掉;点击next

                                

Specify database connection details把这也点掉;点击next;

                                    

全部都用手写,所以把create sessionFactry class此处也点掉;点击Finish;然后lib里面会自动增加一系列jar包

                                                        

并且src里面也生成了hibernate.cfg.xml,:

由于本人此次练习的是整合Struts与Hibernate进行应用的开发

所以还要进行struts相关文件的配置,由于struts相关文件配置比较简单,所以此处省略;

首先编写一个持久化类:本人创建的是person类:模型类即为javabean,很简单;

注:持久化类符合JavaBean的规范,包含一些属性,以及与之对应的getXXX()setXXX()方法。

持久化类有一个id属性,用来惟一标识Person类的每个对象。在面向对象术语中,这个id属性被称为对象标识符(OIDObject Identifier

Hibernate要求持久化类必须提供一个不带参数的默认构造方法

下一步即写一个提交到数据库内容的表单,简单的表单不在此处写了。然后写一个action,获得表单的内容:此处action中的处理方法:execute()里面主要是把表单所要提交的信息调用模型类封装成一个类

下一步即将和hibernate的API打交道了。。。编写工具类HibernateUtil这个类主要是获得和数据库打交道的Session类

[java]

  1. 主要代码:  

  2.   

  3. privatestatic SessionFactory sessionFactory;  

  4.   

  5. //由于一共只有一个SessionFactory所以把创建SessionFactory的代码放到static代码块里面,让他只创建一次  

  6.   

  7.     static {  

  8.   

  9.         try {  

  10.   

  11.             /** 

  12.  

  13.              * 创建SessionFactory过程: 

  14.  

  15.              * 1.new Configuration().configure()获得一个configuration的实例 

  16.  

  17.              * 2.configuration.buildSessionFactory()获得创建session的工厂sessionFactory的实例 

  18.  

  19. 注:Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管理相应的配置文档,但是通常我们只创建一个configuration实例。 

  20.  

  21.              * */        

  22.   

  23.             sessionFactory = new Configuration().configure()  

  24.   

  25.                     .buildSessionFactory();  

  26.   

  27.         } catch (Exception e) {  

  28.   

  29.             e.printStackTrace();  

  30.   

  31.         }  

  32.   

  33.     }  

  34.   

  35.     publicstatic Session openSession(){  

  36.   

  37.         //获得与数据库打交道的实例session  

  38.   

  39.         Session session=sessionFactory.openSession();  

  40.   

  41.         //把工具session返回给调用者  

  42.   

  43.         return session;  

  44.   

  45.     }     


注意:此Session非彼Session(HttpSession)

一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。

SessionFactory有以下特点:

–它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。

–它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。

 

Session接口是Hibernate应用使用最广泛的接口。

Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。

Session有以下特点:

–不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。

–Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。

Session接口提供了操纵数据库的各种方法,如:

–save()方法:把Java对象保存数据库中。

–update()方法:更新数据库中的Java对象。

–delete()方法:把Java对象从数据库中删除。

–get()方法:从数据库中加载Java对象。

 

然后在编写用session处理数据类DAO类,先编写有关接口然后编写实现类personDaoImpl,这个类主要用session处理数据执行事务的类:

示例代码:

[java] 

  1. //调用工具类获得session  

  2.   

  3. Session session = factory.openSession();  

  4.   

  5. Transaction tx;  

  6.   

  7. try {  

  8.   

  9. //开始一个事务  

  10.   

  11. tx = session.beginTransaction();  

  12.   

  13. //执行事务  

  14.   

  15. Student stu=new Student(“李华”,”男”,”山东”);  

  16.   

  17.    

  18.   

  19. Session.save(stu);  

  20.   

  21. //提交事务  

  22.   

  23. tx.commit();  

  24.   

  25. }  

  26.   

  27. catch (Exception e) {  

  28.   

  29. //如果出现异常,就撤销事务  

  30.   

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

  32.   

  33. throwe;  

  34.   

  35. }  

  36.   

  37. finally {  

  38.   

  39. //不管事务执行成功与否,最后都关闭Session  

  40.   

  41. session.close();  

  42.   

  43. }  


                                                   

然后编写逻辑处理类(服务类):先写有关接口,然后写实现类.这个类主要用于处理一些逻辑处理,在这个地方主要用于调用数据处理类DAO进行数据处理

[java]

  1. publicclass PersonServiceImpl implements PersonService {  

  2.   

  3.    

  4.   

  5.     publicvoid savePerson(Person person)  

  6.   

  7.     {  

  8.   

  9.         PersonDAO personDAO = new PersonDAOImpl();  

  10.   

  11.         personDAO.savePerson(person);  

  12.   

  13.     }  

  14.   

  15. }  


 然后直接在action里面写出PersonServiceImpl实例进行调用其方法进行就可以了。Action里面主要处理方法代码示例

 

[java]

  1. <span xmlns="http://www.w3.org/1999/xhtml">public String execute() throws Exception  

  2.   

  3.     {  

  4.   

  5.         Person person = new Person();  

  6.   

  7.          

  8.   

  9.         person.setUsername(username);  

  10.   

  11.         person.setPassword(password);  

  12.   

  13.         person.setAge(age);  

  14.   

  15.     java.sql.Date registerDate = new java.sql.Date(new                  java.util.Date().getTime());  

  16.   

  17.         System.out.println("222222");  

  18.   

  19.         person.setRegisterDate(registerDate);  

  20.   

  21.          

  22.   

  23.         PersonServiceImpl personService = new PersonServiceImpl();  

  24.   

  25.          

  26.   

  27.         personService.savePerson(person);  

  28.   

  29.          

  30.   

  31.         returnSUCCESS;  

  32.   

  33.          

  34.   

  35.     }  

  36. </span>  

 写到这,一个hibernate主要的逻辑层就差不多了,现在就主要看怎样写配置文件了:先配置hibernate.cfg.xml.主要配置示例:

 

[html]

  1. <span xmlns="http://www.w3.org/1999/xhtml"><?xml version='1.0' encoding='UTF-8'?>  

  2.   

  3. <!DOCTYPE hibernate-configuration PUBLIC  

  4.   

  5.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  

  6.   

  7.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  

  8.   

  9.    

  10.   

  11. <hibernate-configuration>  

  12.   

  13.    

  14.   

  15.     <session-factory>  

  16.   

  17.     <property name="connection.url">jdbc:sqlserver://localhost:1433; DatabaseName=Hibernate</property>  

  18.   

  19.     <property name="connection.username">sa</property>  

  20.   

  21.     <property name="connection.password">123456</property>  

  22.   

  23.     <property    name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>  

  24.   

  25.     <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>  

  26.   

  27.     <property name="show_sql">true</property>  

  28.   

  29.     <mapping resource="Person.hbm.xml"/>//映射到具体person表的配置文件  

  30.   

  31.     </session-factory>  

  32.   

  33.    

  34.   

  35. </hibernate-configuration></span>  


注意:

Hibernate的描述文件中存放数据库连接驱动程序类,登陆数据库的用户名/密码,映射实体类配置文件的位置等信息。

将该配置文件存放在src目录下

描述文件相关属性描述含义:

                                

最后一步:

对持久化(实体)类Person.java文件创建一个Hibernate映射文件Person.hbm.xml

Java的实体类是通过配置文件与数据表中的字段相关联。Hibernate在运行时解析配置文件,根据其中的字段名生成相应的SQL语句

将该文件存放在src目录下

具体代码示例:

 

[html] 

  1. <span xmlns="http://www.w3.org/1999/xhtml"><?xml version="1.0"?>  

  2.   

  3. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  

  4.   

  5. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

  6.   

  7.    

  8.   

  9. <hibernate-mapping>  

  10.   

  11.     <class name="com.csh.model.Person" table="person">   

  12.   

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

  14.   

  15.          <generator class="increment"></generator>     

  16.   

  17.      </id>  

  18.   

  19.      <property name="username" column="username" type="string"></property>  

  20.   

  21.      <property name="password" column="password" type="string"></property>  

  22.   

  23.      <property name="age" column="age" type="int"></property>  

  24.   

  25.      <property name="registerDate" column="registerDate" type="date"></property>  

  26.   

  27.     </class>  

  28.   

  29. </hibernate-mapping></span>  


注:id元素对应的一定是数据库的主键列;class="increment"意为自增

                                                   

<property>元素映射值   类型属性

name属性:指定持久化类的属性的名字。

type属性:指定Hibernate或Java映射类型。Hibernate映射类型是Java类型与SQL类型的桥梁。

column属性:指定与类的属性映射的表的字段名。

                            

至此,hibernate开发过程和相关配置就此完毕