在上篇博客中,我們介紹了《hibernate基本概念和體系結構》,也對hibernate框架有了一個初步的瞭解,本文我將向大家簡單介紹Hibernate的核心API調用庫,並講解一下它的基本配置。核心API的底層實現和源碼解析將在以後的博客中一一爲大家講解。
首先我們一起來看一下開發一個hibernate應用程序的大體流程是什麼樣的(流程順序可以顛倒):
•創建Hibernate的配置文件
•創建持久化類
•創建對象-關係映射文件
•通過Hibernate API編寫訪問數據庫的代碼
關於配置文件推薦閱讀:Hibernate常用配置文件詳解
知道了開發流程,那麼我們就開始我們的第一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屬性被稱爲對象標識符(OID,Object Identifier)
•Hibernate要求持久化類必須提供一個不帶參數的默認構造方法
下一步即寫一個提交到數據庫內容的表單,簡單的表單不在此處寫了。然後寫一個action,獲得表單的內容:此處action中的處理方法:execute()裏面主要是把表單所要提交的信息調用模型類封裝成一個類
下一步即將和hibernate的API打交道了。。。編寫工具類HibernateUtil這個類主要是獲得和數據庫打交道的Session類
- 主要代碼:
- privatestatic SessionFactory sessionFactory;
- //由於一共只有一個SessionFactory所以把創建SessionFactory的代碼放到static代碼塊裏面,讓他只創建一次
- static {
- try {
- /**
- * 創建SessionFactory過程:
- * 1.new Configuration().configure()獲得一個configuration的實例
- * 2.configuration.buildSessionFactory()獲得創建session的工廠sessionFactory的實例
- 注:Configuration類用來管理我們的配置文件的信息的,通過它,我們可以通過創建一個configuration實例來管理相應的配置文檔,但是通常我們只創建一個configuration實例。
- * */
- sessionFactory = new Configuration().configure()
- .buildSessionFactory();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- publicstatic Session openSession(){
- //獲得與數據庫打交道的實例session
- Session session=sessionFactory.openSession();
- //把工具session返回給調用者
- return session;
- }
注意:此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處理數據執行事務的類:
示例代碼:
- //調用工具類獲得session
- Session session = factory.openSession();
- Transaction tx;
- try {
- //開始一個事務
- tx = session.beginTransaction();
- //執行事務
- Student stu=new Student(“李華”,”男”,”山東”);
- Session.save(stu);
- //提交事務
- tx.commit();
- }
- catch (Exception e) {
- //如果出現異常,就撤銷事務
- if (tx!=null) tx.rollback();
- throwe;
- }
- finally {
- //不管事務執行成功與否,最後都關閉Session
- session.close();
- }
然後編寫邏輯處理類(服務類):先寫有關接口,然後寫實現類.這個類主要用於處理一些邏輯處理,在這個地方主要用於調用數據處理類DAO進行數據處理
- publicclass PersonServiceImpl implements PersonService {
- publicvoid savePerson(Person person)
- {
- PersonDAO personDAO = new PersonDAOImpl();
- personDAO.savePerson(person);
- }
- }
然後直接在action裏面寫出PersonServiceImpl實例進行調用其方法進行就可以了。Action裏面主要處理方法代碼示例
- <span xmlns="http://www.w3.org/1999/xhtml">public String execute() throws Exception
- {
- Person person = new Person();
- person.setUsername(username);
- person.setPassword(password);
- person.setAge(age);
- java.sql.Date registerDate = new java.sql.Date(new java.util.Date().getTime());
- System.out.println("222222");
- person.setRegisterDate(registerDate);
- PersonServiceImpl personService = new PersonServiceImpl();
- personService.savePerson(person);
- returnSUCCESS;
- }
- </span>
寫到這,一個hibernate主要的邏輯層就差不多了,現在就主要看怎樣寫配置文件了:先配置hibernate.cfg.xml.主要配置示例:
- <span xmlns="http://www.w3.org/1999/xhtml"><?xml version='1.0' encoding='UTF-8'?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <property name="connection.url">jdbc:sqlserver://localhost:1433; DatabaseName=Hibernate</property>
- <property name="connection.username">sa</property>
- <property name="connection.password">123456</property>
- <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
- <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
- <property name="show_sql">true</property>
- <mapping resource="Person.hbm.xml"/>//映射到具體person表的配置文件
- </session-factory>
- </hibernate-configuration></span>
注意:
Hibernate的描述文件中存放數據庫連接驅動程序類,登陸數據庫的用戶名/密碼,映射實體類配置文件的位置等信息。
•將該配置文件存放在src目錄下
描述文件相關屬性描述含義:
最後一步:
對持久化(實體)類Person.java文件創建一個Hibernate映射文件Person.hbm.xml
Java的實體類是通過配置文件與數據表中的字段相關聯。Hibernate在運行時解析配置文件,根據其中的字段名生成相應的SQL語句
•將該文件存放在src目錄下
具體代碼示例:
- <span xmlns="http://www.w3.org/1999/xhtml"><?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.csh.model.Person" table="person">
- <id name="id" column="id" type="int">
- <generator class="increment"></generator>
- </id>
- <property name="username" column="username" type="string"></property>
- <property name="password" column="password" type="string"></property>
- <property name="age" column="age" type="int"></property>
- <property name="registerDate" column="registerDate" type="date"></property>
- </class>
- </hibernate-mapping></span>
注:id元素對應的一定是數據庫的主鍵列;class="increment"意爲自增
<property>元素映射值 類型屬性
•name屬性:指定持久化類的屬性的名字。
•type屬性:指定Hibernate或Java映射類型。Hibernate映射類型是Java類型與SQL類型的橋樑。
•column屬性:指定與類的屬性映射的表的字段名。
至此,hibernate開發過程和相關配置就此完畢