在上篇部落格中,我們介紹了《hibernate基本概念和體繫結構》,也對hibernate架構有了一個初步的瞭解,本文我將向大家簡單介紹Hibernate的核心API調用庫,並講解一下它的基本配置。核心API的底層實現和源碼解析將在以後的部落格中一一為大家講解。
首先我們一起來看一下開發一個hibernate應用程式的大體流程是什麼樣的(流程順序可以顛倒):
•建立Hibernate的設定檔
•建立持久化類
•建立對象-關係對應檔
•通過Hibernate API編寫訪問資料庫的代碼
關於設定檔推薦閱讀:細談Hibernate(四)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處理資料執行事務的類:
範例程式碼:
//調用工具類獲得sessionSession 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 {//不管事務執行成功與否,最後都關閉Sessionsession.close();}
然後編寫邏輯處理類(服務類):先寫有關介面,然後寫實作類別.這個類主要用於處理一些邏輯處理,在這個地方主要用於調用資料處理類DAO進行資料處理
publicclass PersonServiceImpl implements PersonService { publicvoid savePerson(Person person) { PersonDAO personDAO = new PersonDAOImpl(); personDAO.savePerson(person); }}
然後直接在action裡面寫出PersonServiceImpl執行個體進行調用其方法進行就可以了。Action裡面主要處理方法程式碼範例
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; }
寫到這,一個hibernate主要的邏輯層就差不多了,現在就主要看怎樣寫設定檔了:先配置hibernate.cfg.xml.主要配置樣本:
<?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>
注意:
Hibernate的描述檔案中存放資料庫連接驅動程式類,登陸資料庫的使用者名稱/密碼,映射實體類設定檔的位置等資訊。
•將該設定檔存放在src目錄下
描述檔案相關屬性描述含義:
最後一步:
對持久化(實體)類Person.java檔案建立一個Hibernate對應檔Person.hbm.xml
Java的實體類是通過設定檔與資料表中的欄位相關聯。Hibernate在運行時解析設定檔,根據其中的欄位名產生相應的SQL語句
•將該檔案存放在src目錄下
具體程式碼範例:
<?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>
註:id元素對應的一定是資料庫的主鍵列;class="increment"意為自增
<property>元素映射值 類型屬性
•name屬性:指定持久化類的屬性的名字。
•type屬性:指定Hibernate或Java映射類型。Hibernate映射類型是Java類型與SQL類型的橋樑。
•column屬性:指定與類的屬性對應的表的欄位名。
至此,hibernate開發過程和相關配置就此完畢