天天看點

Hibernate入門

hibernate是什麼

    hibernate是一個輕量級的ormapping架構

    ormapping原理(object relational mapping)

Hibernate入門

ormapping基本對應規則:

1:類跟表相對應

2:類的屬性跟表的字段相對應

3:類的執行個體與表中具體的一條記錄相對應

4:一個類可以對應多個表,一個表也可以對應對個類

5:db中的表可以沒有主鍵,但是object中必須設定主鍵字段

6:db中表與表之間的關系(如:外鍵)映射成為object之間的關系 

7:object中屬性的個數和名稱可以和表中定義的字段個數和名稱不一樣

ormapping的基本實作方式:

使用jdbc,用sql來操作資料庫,隻是看動态生成還是人工寫代碼來實作。

大家想想,我們實作過ormapping嗎?

Hibernate入門
Hibernate入門

hibernate能幹什麼:

    hibernate主要用來實作java對象和表之間的映射,除此之外還提供還提供資料查詢和擷取資料的方法,可以大幅度減少開發時人工使用sql和jdbc處理資料的時間。

hibernate的目标是對于開發者通常的資料持久化相關的程式設計任務,解放其中的95%。對于以資料為中心的程式來說,它們往往隻在資料庫中使用存儲過程來實作商業邏輯,hibernate可能不是最好的解決方案;對于那些在基于java的中間層應用中,它們實作面向對象的業務模型和商業邏輯的應用,hibernate是最有用的。

    hibernate可以幫助你消除或者包裝那些針對特定廠商的sql代碼,并且幫你把結果集從表格式的表示形式轉換到一系列的對象去。

Hibernate入門

一個非常簡要的hibernate體系結構的高層概要圖

Hibernate入門

hibernate運作時體系結構

“最小”的體系結構方案,要求應用程式提供自己的 jdbc 連接配接并管理自己的事務。這種方案使用了hibernate api 的最小子集.

Hibernate入門

“全面解決”的體系結構方案,将應用層從底層的jdbc/jta api中抽象出來,而讓hibernate來處理這些細節。

Hibernate入門

sessionfactory (org.hibernate.sessionfactory)

針對單個資料庫映射關系經過編譯後的記憶體鏡像,是線程安全的(不可變)。 它是生成session的工廠,本身要用到connectionprovider。

session (org.hibernate.session)

表示應用程式與持久儲存層之間互動操作的一個單線程對象,此對象生存期很短,隐藏了jdbc連接配接,也是transaction的工廠。

transaction (org.hibernate.transaction)

應用程式用來指定原子操作單元範圍的對象,它是單線程的,生命周期很短。它通過抽象将應用從底層具體的jdbc、jta以及corba事務隔離開。

connectionprovider (org.hibernate.connection.connectionprovider)

生成jdbc連接配接的工廠(有連接配接池的作用)。它通過抽象将應用從底層的datasource或drivermanager隔離開。僅供開發者擴充/實作用,并不暴露給應用程式使用。

transactionfactory (org.hibernate.transactionfactory)

生成transaction對象執行個體的工廠。僅供開發者擴充/實作用,并不暴露給應用程式使用。

 helloworld

要研究怎麼做,先得搞清楚需要做什麼

根據剛才的學習,做基本的hibernate應用程式,要完成下面的工作:object、資料庫的表、兩種配置檔案、用戶端程式來調用hibernate的接口進行操作。

建構環境

最簡單的方法:把hibernate-release-4.0.0.beta4.zip包裡面lib/required下的jar包全部添加到工程的library裡面,另外還需添加slf4j的實作包slf4j-log4j12-1.5.8.jar和log4j的實作包log4j-1.2.16.jar,還有别忘了把jdbc的驅動jar包也加入到library裡面

object怎麼做

1:就是前面學過的vo的寫法(規則同樣是那四點)

2:要求必須有一個public為空參的構造方法,現在寫vo一般不寫構造方法,預設就有一個,但是寫構造方法的時候要注意寫上一個public為空參的構造方法

3:要求提供一個辨別屬性(identifier)

4:使用非final的類(因為要使用代理來延遲實體的裝載)

5:設若建構一個對象:cn.javass.h4.hello.usermodel,有四個屬性:uuid,userid,name,age

在資料庫中建表

設若建構一個表為tbl_user,字段:uuid,userid,name,age

配置xxx.cfg.xml

1:預設名稱為 hibernate.cfg.xml

2:存放在目前classes的根目錄下,開發的時候在src根下就可以了

3:主要有如下四部配置設定置 :

(1)與db的連接配接

(2)可選配置

(3)資源檔案注冊

(4)二級緩存

4:配置的時候可以到hibernate發行包裡面找個hibernate.cfg.xml的例子,比如可以用“\project\hibernate-documentation\quickstart\tutorials\basic\src\test\resources”下面的hibernate.cfg.xml作例子

5:示例如下:

配置xxx.hbm.xml

1:與被描述的類同名 ,如:usermodel.hbm.xml

2:存放位置與所描述類存放在同一檔案夾下

(1)類和表的映射

(2)主鍵的映射

(3)類的屬性和db中字段的映射

(4)關系的映射

4:配置的時候可以到hibernate發行包裡面找個例子,比如可以用“\project\hibernate-core\src\test\java\org\hibernate\test\cid”下面的customer.hbm.xml作例子

測試:

直接在elipse裡面運作client檔案即可,運作結束,你将會看到在console輸出:“hibernate: insert into tbl_user (userid, name, age, uuid) values (?, ?, ?, ?)”,打開資料庫的資料表,你會看到一條值已經加入了。

其他:

1:sessionfactory sf = new configuration().configure().buildsessionfactory();這句話的意思是讀取hibernate.cfg.xml,建立session工廠,是線程安全的。

預設是”hibernate.cfg.xml”,不用寫出來,如果檔案名不是”hibernate.cfg.xml”,那麼需要顯示指定,如下:

sessionfactory sf = new configuration(). configure( “javass.cfg.xml” ).buildsessionfactory();

2:session是應用程式主要使用的hibernate接口,約相當于jdbc的connection+statement/preparedstatement的功能,是線程不安全的

3:在hibernate4裡面,已經不推薦使用configuration類了,而改為使用 serviceregistrybuilder和metadatasources來代替,新的寫法大緻如下:

serviceregistrybuilder builder = new serviceregistrybuilder().configure();

builder.applysetting("connection.driver_class", "oracle.jdbc.driver.oracledriver");

builder.applysetting("connection.url", "jdbc:oracle:thin:@localhost:1521:orcl");

builder.applysetting("connection.username", "ztb");

builder.applysetting("connection.password", "ztb");

builder.applysetting("connection.pool_size", "2");

builder.applysetting("hibernate.dialect", "org.hibernate.dialect.oracledialect");

builder.applysetting("show_sql", "true");

metadatasources sources = new metadatasources( builder.buildserviceregistry() );

sources.addresource("cn/javass/h4/hello/usermodel.hbm.xml");

metadataimpl metadata = (metadataimpl) sources.buildmetadata();

sessionfactory sf = metadata.getsessionfactorybuilder().buildsessionfactory();

這種寫法,現在還沒有實作完全,不太好用,是以官方給出的示例裡面還是采用以前的方式,大家先了解一下。

4:這裡使用的事務transaction是hibernate的transaction,需要有,不能去掉。