天天看點

Hibernate(1)——資料通路層的架構模式

  建立一個資料庫bbs,一張表user

Hibernate(1)——資料通路層的架構模式

  持久化類和我們的資料庫的表是有對應關系的,故前提是,得有一張資料庫的表user二維表(至少1張)和對應的實體類user類,我在vo包(資料對象value object:頁面與頁面之間的傳遞值時儲存值的對象)建立:

Hibernate(1)——資料通路層的架構模式
Hibernate(1)——資料通路層的架構模式
Hibernate(1)——資料通路層的架構模式

同時它也是一個pojo類——pojo全稱是plain ordinary java object / plain old java object,中文可以翻譯成:普通java類,具有一部分getter/setter方法的那種類就可以稱作pojo類。

  建立對象-關系映射的xml檔案,必須放在實體類對應的包(我的是vo)下,名字嚴格對應為:類名.hbm.xml

Hibernate(1)——資料通路層的架構模式
Hibernate(1)——資料通路層的架構模式
Hibernate(1)——資料通路層的架構模式

  <class>元素用于指定類和表之間的映射,name屬性設定類名(包含路徑),table屬性設定表名,預設以類名作表名

Hibernate(1)——資料通路層的架構模式

  id子元素設定持久化類的oid和表的主鍵的映射,id的子元素< generator>元素指定oid的生成器。

  property子元素設定類的屬性和表的字段的映射

name – 對應類的屬性名稱

type – 指定屬性的類型

column – 指定表字段的名稱

not-null –指定屬性是否允許為空

  順便把hibernate的主配置檔案hibernate.cfg.xml(需放在src根目錄下)補充好,千萬别忘了把之前對象關系映射配置檔案引入到主配置檔案内,mapping……

Hibernate(1)——資料通路層的架構模式
Hibernate(1)——資料通路層的架構模式
Hibernate(1)——資料通路層的架構模式

  建立dao包,并通過hibernate api 編寫通路資料庫的代碼,這裡必須要知道hibernate的一些核心的類和接口。如下:

  hibernate 架構的核心類和接口

sessionfactory:是一個核心的接口,相當于hibernate和資料庫連接配接的一個大管家,它緩存了hibernate的配置資訊和映射的中繼資料資訊,屬于重量級的,故執行個體化它的實作類隻需要執行個體化一次,且不能輕易的關閉,如果關閉了,和資料庫就斷開了,此外,連接配接不同的資料庫,需要建立不同的sessionfactory對象,而執行個體化該類,需要用到一個該接口的實作類——配置類configuration,用configuration的對象執行個體化之後,才能建立session的執行個體。

sessionfactory的建立,configuartion.buildsessionfactory()。

sessionfactory是線程安全的,可以安全的讓多個線程進行共享,一般整個應用隻有唯一的一個sessionfactory執行個體。

sessionfactory緩存

内置緩存,存儲hibernate配置資訊和映射中繼資料資訊,實體媒體是記憶體

外置緩存,是一個可配置的緩存插件,可以存放大量的資料庫資料的拷貝,實體媒體可以是記憶體或者是硬碟

configuration:是sessionfactory接口的實作類。

該實作類兩個功能

負責管理hibernate的運作的底層配置資訊,包括:資料庫的url、資料庫使用者名和密碼、jdbc驅動,資料庫dialect,資料庫連接配接池等。

生成sessionfactory的對象,建立的sessionfactory對象能可以建立session

使用的兩種方法

屬性檔案(hibernate.properties),調用代碼:configuration cfg = new configuration();

xml檔案(hibernate.cfg.xml),調用代碼:configuration cfg = new configuration().configure();

session:也是一個接口,繼承了sessionfactory,session是hibernate持久操作的基礎核心,可以簡單的了解為之前jdbc裡的connection對象。

session的建立(依靠sessionfactory,sessionfactory對象來自configuartion.buildsessionfactory();,而configuartion這個執行個體化對象來自new configuration().configure();),session session = sessionfactory.opensession();代表了一個資料庫的連接配接,有了該session連接配接,就可對資料庫進行操作(crud),故也叫session為持久化管理器。而對資料庫的操作,我們需要封裝到事務當中,也就是hibernate的transaction

session是一個輕量級對象,是非線程安全的,通常和一個資料庫事務綁定。

transaction:一個接口,它将應用代碼從底層的事務實作中抽象出來,是一個jdbc事務或一個jta事務,可以在配置檔案中指定,預設是jdbc事務。

調用代碼:transaction tx = session.begintransaction();

使用hibernate進行操作時,必須顯式的調用transaction(預設:autocommit=false)

  類圖:

Hibernate(1)——資料通路層的架構模式

  

  再介紹下query與criteria接口

  query接口,允許程式員在資料庫上執行查詢并控制查詢如何執行,查詢語句使用hibernate的hql或本地資料庫的sql,調用代碼:query query = session.createquery(“from user”);

  criteria接口,是傳統sql的對象化表示,調用代碼:criteria criteria = session.createcriteria(tuser.class);

  結構如圖:

Hibernate(1)——資料通路層的架構模式

  代碼如下:

Hibernate(1)——資料通路層的架構模式

 view code

    

  整個項目結構

Hibernate(1)——資料通路層的架構模式

  運作結果正确,資料成功插入;hibernate: insert into user (username, password, userid) values (?, ?, ?)

Hibernate(1)——資料通路層的架構模式
Hibernate(1)——資料通路層的架構模式
Hibernate(1)——資料通路層的架構模式

  小結:持久化類和關系資料庫的映射

Hibernate(1)——資料通路層的架構模式

  說說pojo和javabean的差別?

  前面簡單說了pojo是什麼——普通java類,具有一部分getter/setter方法的那種類就可以稱作pojo,理想地講,一個pojo是一個不受任何限制的java對象(除了java語言規範)。例如一個pojo不應該是

擴充預定的類

實作預定的接口

包含預定的标注,如   @javax.ejb.entity public class baz{ ...

  但是javabean則比 pojo複雜很多,javabean 是可複用的元件,javabean 并沒有嚴格的規範,理論上講,任何一個 java 類都可以是一個 bean 。但通常情況下,由于 javabean 是被容器所建立(如 tomcat) 的,是以 javabean 應具有一個無參的構造器,另外,通常 javabean 還要實作 serializable 接口用于實作 bean 的持久性。javabean 是不能被跨程序通路的。

  那麼為什麼需要javabean?

  因為java欠缺屬性、事件、多重繼承功能。是以在java中實作一些面向對象程式設計的常見需求,隻能手寫大量膠水代碼。javabean正是編寫這套膠水代碼的慣用模式或約定。對它最簡單的了解是資料包,這個資料包裡包含了一些資訊(屬性),比如名稱,性别等,包含了可以給這些屬性指派和取值的方法(get和set方法)。通過執行個體化後的指派操作,可在别的地方通過get方法把值取出來。這就是javabean,或者叫vo。如果在方法中含有了一些邏輯,比如getname的時候,要給name前面加上公司名稱……通常情況下,就叫做bo。而資料庫的表對應的持久化類一般叫pojo,這些東西都可以統稱為javabean,核心就是指派(set)和取值(get)。如果需要用到讀寫硬碟的緩存,需要網絡傳輸……則需要序列化這個javabean.實作serializable接口。

  《spring in action》書裡詳細說到:

  javabean :是公共java類,但是為了編輯工具識别,需要滿足至少三個條件:

有一個public預設構造器(例如無參構造器)

屬性使用public 的get,set方法通路,也就是說屬性設定成private,同時get,set方法與屬性名的大小也需要對應。例如屬性name,get方法就要寫成,public string getname(){},n大寫。

需要序列化。這個是架構,工具跨平台反映狀态必須的

重寫hashcode和equals方法(可選)……

  ……

  這裡插播一下ejb的概念:

在java1996年釋出,當年12月即釋出了java bean1.00-a,有什麼用呢?這樣java對象可以重用和統一操作,例如原來說的awt元件(例如一個點point(x,y),ide可以自動展現它的狀态量x,y給你配置,).這就是javabean的來曆,

在實際企業開發中,需要實作事務,安全,分布式,javabean就不好用了.sun公司就開始往上面堆功能,堆成了一個加強版的javabean,這就是ejb的來曆;

ejb功能強大,但是太重了,很多時候都是殺雞用牛刀!此時程式設計技術有了一定進展,就是di(依賴注入),aop(面向切面),開發者現在可以通過很簡單的javabean也能完成ejb的事情了。

spring誕生了.

  總的來說,在企業開發中,需要可伸縮的性能和事務、安全機制,這樣能保證企業系統平滑發展,而不是發展到一種規模重新更換一套軟體系統。 然後就提高了協定要求,就出現了enterprise bean。ejb在javabean基礎上又提了一些要求,當然更複雜了。

  pojo :有個叫josh mackenzie人覺得,ejb太複雜了,完全沒必要每次都用,是以發明了個pojo,pojo是普通的javabean,什麼是普通,就是和ejb對應的。總之,差別就是,你先判斷是否滿足javabean的條件,然後如果再實作一些要求,滿足ejb條件就是ejb,否則就是pojo。

  《think in java》一書在最後一章gui裡面講到:javabean最初是為java gui的可視化程式設計實作的,拖動ide建構工具建立一個gui 元件(如多選框)其實是工具給你建立java類,并把類的屬性暴露出來給你修改調整,将事件監聽器暴露出來。

辛苦的勞動,轉載請注明出處,謝謝……http://www.cnblogs.com/kubixuesheng/p/5177238.html