Welcome to Yumao′s Blog.
最近忙着拿畢業證啊什麼的事情
一次把三天的都丟上好了
順帶說下PDF就不再貼出詳細地址了
因爲主頁就可以直接選擇相應的標題進行瀏覽
PDF主頁爲 http://reader.yumao.name
1.Hibernate基本概念
1)Hibernate有什麼作用
a.Hibernate框架主要用於對數據庫操作,是對JDBC的封裝.在應用程序中實現數據訪問層.
b.Hibernate好處
a.避免程序員寫大量複雜SQL
b.SQL移植性較差,Hibernate可以自動生成SQL,移植性強
c.自動完成數據記錄與Java對象之間的映射
2)了解Hibernate基本原理--ORM
Hibernate基於ORM思想的實現. Object Relation Mapping對象關係
.
映射.
Hibernate可以完成java對象和數據表記錄之間的映射,這樣程序員在業務層只要對這些對象操作,就可以實現對數據庫的操作.
Hibernate主要構成:
a.hibernate主配置(數據庫連接參數)
b.實體類<--映射文件-->數據表
*2.Hibernate基本使用
1)主要使用步驟
a.引入hibernate開發包jar
b.在src下添加hibernate.cfg.xml主配置文件(1個)
用於定義數據庫連接參數
c.定義實體類User(n個)
d.定義映射描述文件User.hbm.xml(n個)
e.利用Hibernate API完成增刪改查操作
hibernate.cfg.xml---->User.hbm.xml---->User類
修改了hbm.xml的名稱和所在位置,要修改hibernate.cfg.xml的
修改了實體類User的名稱和包路徑,要修改hbm.xml文件的的name屬性
修改了hibernate.cfg.xml的名稱和位置,要修改conf.configural("指定路徑");
2)基本操作(必須掌握)
添加 : session.save()
刪除 : session.delete()
更新 : session.update()
findById查詢 session.load()
findAll查詢 Query query = session.createQuery("from User");
List list = query.list();
3)Hibernate提供的映射類型
在hbm.xml映射文件中,利用type="映射類型"使用.
主要作用是指定屬性和字段之間的如何進行類型轉換
*整數:integer,long
*浮點數:double
*字符串:string
*日期時間:date(僅包含年月日),timestamp(包含年月日時分秒)
*布爾:true_false 完成布爾屬性和T,F字符之間的轉換
yes_no 完成布爾屬性和Y,N字符之間的轉換
其他: big_decimal,big_integer,blob,clob
4)Hibernate提供的主鍵生成方式
僅對添加操作有意義,在添加時,利用指定的主鍵生成方式獲取主鍵值,寫入數據表.
*a. identity
Hibernate利用數據庫自動增長功能,設置主鍵值.要求數據庫得支持,在設計表時,設置自動增長功能.例如MySQL,SQLServer
*b. sequence
Hibernate利用指定的sequence對象,獲取nextval,將該值作為主鍵值.
適用於Oracle
user_seq
*c. native
Hibernate會根據方言類型不同,自動選擇主鍵生成方式.如果是MySQLDialect會選擇identity;如果是OracleDialect會選擇sequence
*d. increment
Hibernate會先執行select max(id) from table ,之後將最大值+1作為主鍵值.
*e. assigned
Hibernate忽略主鍵的管理,需要程序員在程序中指定設置id值.
f. 其他
hilo:基於高低位算法生成id值
uuid:基於uuid算法生成id值
1.Hibernate框架的特性
1)一級緩存(默認啟用)
session對象級別的緩存,利用該session取出的對象會放到緩存中.在後續查詢時,首先去緩存中尋找,沒有再去數據庫尋找.
session緩存區在session關閉後銷毀.session複雜維護緩存區中對象的狀態.
在使用時,為了更好發揮一級緩存,需要保障同一個線程處理中,使用同一個Session對象.
a.使用ThreadLocal對SessionUtil進行改造,將Session對象與ThreadLocal綁定.
b.Hibernate3之後的新版本,可以使用以下方法
首先在hibernate.cfg.xml中添加配置
thread
之後使用sessionFactory.getCurrentSession()方法獲取Session
注意:在使用此session時,必須將session操作封裝在一個transaction
一級緩存的管理:
session.evict(obj);將obj對象從當前session的一級緩存中清除.
session.clear():清除當前session的一級緩存.
2)延遲加載
當獲取一個實體對象後,實體對象並沒有立刻發送SQL語句,去數據庫加載數據.而是在調用對象的getXXX()方法時採取加載數據.
支持延遲加載的方法:session.load(),query.iterator().延遲加載方法返回的對象類型,是動態代理類型.
session.get()和session.load()方法功能是按主鍵做條件查詢數據,區別
如下:
a.get()方法不支持延遲加載,load()方法支持
b.如果數據表中沒有符合的記錄,get()方法返回null,load()拋異常
c.如果數據表中有符合的記錄,get()返回的是實體類型對象,load()返回的是動態代理類型對象.
在使用時,需要注意以下事項:
a.使用延遲加載的API後,避免過早的關閉Session.
LazyInitializationException: could not initialize proxy - no Session
b.根據需要選擇延遲加載和非延遲加載API
-----------------了解----------------------
Hibernate延遲加載機制:利用動態生成代理類型機制生成一個動態代理類,並重寫對象的getXXX()方法,當調用get方法時,觸發SQL查詢,去數據庫加載數據.
Hibernate動態生成代理類型機制:
以前編寫程序:
a.編寫一個類源碼
b.調用編譯器將源碼編譯成class字節碼
c.類加載器將字節碼文件載入虛擬機內容
d.虛擬機調用字節碼文件的方法,解釋運行
Session.load()等延遲方法返回的類型是Foo$Enhancer$CGLIB....,
這些類型是Hibernate框架利用程序在內容中動態生成並編譯的類型.
上述功能,是Hibernate調用asm.jar,cglib-2.1.3.jar工具包完成的.
asm.jar主要用於在內存中動態和編譯生成一個類
cglib.jar是基於asm.jar,對其擴展,在內存中生成一個代理類型.該代理類是原類型的一個子類.
3)Hibernate中對象的狀態
在Hibernate使用中,對象的狀態有以下三種
a.臨時對象 : 在程序中使用new方式創建的對象
b.持久對象 : 在程序中與session對象關聯,由session負責管理的對象.
處於session緩存中的對象都是持久對象
對象的持久性:指的是對象的數據狀態在事務提交時可 以與數據庫保持同步更新.
session.flush();//將持久對象與數據庫同步
tx.commit();//事務提交,提交前默認也調用session.flush()
c.託管對象 : 在程序中如果session.close()後,session負責管理的持久 對象將成為託管對象.
垃圾回收器負責回收臨時和託管狀態,持久狀態不能回收.
1.在映射對象之間建立一對多關係one-to-many
1)在一的一方的類中添加集合屬性Set
2)在一的一方的映射文件中添加映射
3)使用時,通過對象的getXXX方法獲取
2.在映射對象之間建立多對一關係many-to-one
1)在多的一方的類中添加一方類型的屬性
去掉關聯字段的屬性
2)在多的一方的映射文件中添加映射
去掉原有關聯字段的映射
3)使用時,通過對象的getXXX方法獲取
Code Package:Hibernate_1-3.tar