小白的Hibernate初學之路(基礎篇)

1. ORM:
對象關係映射,思想是將關係數據庫中表的數據映射爲對象,以對象的形式展現,目的是爲了方便以面向對象的思想來實現隨數據庫的操作
ORM封裝底層數據訪問代碼、還對sql進行了進一步的封裝。
2.Hibernate框架
優點:1).是JDBC的輕量級框架,是一個獨立對象持久層框架,可以用在任何JDBC可以使用的場合
2).Hibernate是一個和JDBC密切相關的框架,其兼容性與JDBC驅動,都和數據庫有一定的關係
3)具有擴展性,API開放
3.Hibernate核心接口
(1)Session:負責執行被持久化對象的CRUD(完成與數據庫的交互)操作,注意,Session是非線程安全的,同時,不同於JSP中的HttpSession
(2)SessionFactory:負責初始化Hibernate,它充當數據存儲源的代理,並負責創建Session對象
從xml文件讀取配置信息構建SessionFactory

    //指定要讀取配置文件的路徑
private static String CONFIG_FILE_LOCATION="/hibernate.cfg.xml";
    //定義ConfigFile屬性並賦值
private static String configFile = CONFIG_FILE_LOCATION;
    //實例化Configuration類
private static Configuration configuration = new Configuration();
//讀取默認配置文件
configuration.configure(configFile);
//構建SessionFactory實例對象
sessionFactory = configuration.buildSessionFactory();
從java屬性文件讀取配置信息構建SessionFactory
    // 創建一個AnnotationConfiguration對象,此時Hibernate會默認加載classpath中的hibernate.properties配置文件
    AnnotationConfiguration configuration=new AnnotationConfiguration();
    //從java持久類獲取映射信息
    configuration.addAnnotatedClass(對象.類名.class);
    //通過AnnotationConfiguration實例的buildSessionFactory()方法構造唯一的SessionFactory實例
    SessionFactory sessionFactory = configuration.buildSessionFactory();
(3)Transaction:負責事務相關的操作,他是可選的
(4)Query和Criteria:負責執行各種數據庫查詢
(5)Configuration:負責並啓動Hibernate,創建SessionFactory對象
**五個接口關係圖**

這裏寫圖片描述
Hibernate配置文件
(1)hibernate.cfg.xml:封裝了對各種關係數據庫的訪問操作,使用hibernate.cfg.xml作爲配置文件,需要將其保存到當前項目或者應用的classpath路徑下,這樣Configuration對象調用configure()方法加載Hibernate配置選項是會自動加載該文件,如果Hibernate的配置文件沒有使用默認的文件名或者保存在classpath路徑下,則需要在Configuration對象的configure()方法中指定文件路徑和文件名
(2)hibernate.properties:屬性配置格式的編碼比較簡單,只是“鍵=值”,容易掌握和理解,該文件需要保存在項目類路徑的跟目錄下。
Hibernate映射文件
主要配置實體類與數據庫表之間的映射關係,在這個配置文件中需指定類/表映射配置、主鍵映射配置和屬性/字段配置等,命名方式爲:className.hbm.xml ,映射文件與實體類放在一起,在相同的包中
①.hibernate-mapping元素:它是每一個hibernate的映射文件的根元 素,包含了一些可選的屬性,如、schema,catalog、default-lazy、package等
②class元素:是根元素的子元素:用於定義一個持久化與數據表的映射關係,常用屬性有:name,table,schema,proxy等
③id元素:用於定義主鍵,大多數的POJO類都有一個屬性可以爲每一個作爲唯一的標識,id元素定義了該屬性到數據庫表主鍵字段的映射,常用屬性:name,type,column,access,length等
④generator元素:指定主鍵的生成器,通過一個class屬性指定生成器對應的類,hibernate提供的內置生成器有:
increment:適用於邏輯主鍵,由Hibernate自動以增長方式生成
identity:適用於邏輯主鍵,由底層數據庫生成標識符
還有sequence,hilo,seqhilo,uuid,guid,native,assigned,select,foreign
⑤property元素:該元素用於持久化類的屬性與數據庫表字段之間的映射,常用屬性有:
name(必須的):取值 類中的屬性名
coloum:取值 表字段名字,默認爲屬性名字
type: 數據類型
update 默認爲true
insert:默認爲true
lazy:默認爲false
unique:默認爲false
not-null:默認爲false
generator:默認爲never,其他取值有,insert,always

Session操作對象
a.獲取對象:兩個方法 :get() 和load()
b.保存對象 save()方法 和persist()
c.刪除對象:delete()
注意:當事務提交後或者刷新緩存後,記錄才被真正的刪除
d.更新對象:update()
注意:在提交事務是會自動檢測緩存中的對象進行髒數據檢測,發生檢測變化的對象屬性會自動更新到數據庫
Session管理連接
a.connection();獲取這個Session的JDBC連接
b.close():關閉Session,通過中斷JDBC連接並且清空它
c.disconnect():斷開Session與當前JDBC的連接
d.isConnected():檢查Session是否處於連接狀態
e.idDirty():當前Session是否包含需要與數據庫同步的變化,如果提交這個Session是否會有SQL執行
f.isOpen():檢查當前Session是否仍然打開
g.reconnect(Connection connection):重新連接到給定的JDBC連接。

狀態轉換圖
這裏寫圖片描述

悲觀鎖與樂觀鎖
悲觀鎖是指當數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改時保持原狀態,因此,在整個數據處理過程中,將數據處於鎖定狀態。
例: select * fromstudent where name=”Lily” for update;
Hibernate顯式指定鎖模式:
(1).調用Session.load()
(2).調用Session.lock()
(2)調用Query.setLockMode()

樂觀鎖的兩種實現:version 和 timestamp
Hibernate緩存
一級緩存:是Session內置的,不能被卸載,也不能進行任何配置,一級緩存採用的是key-value的Map來實現的,Session緩存存放的是私有數據
兩個管理緩存的方法:
(1)evict(Object obj):將某個對象從Session的一級緩存中清除;適用於以下兩種情況:
①不需要該對象進行同步的數據更新
②在批量進行更新和刪除時,當更新每一個對象後,要釋放對象所佔用的空間
(2)clear():用於將一級緩存中所有的對象全部清除
總結:一級緩存提供了一個臨時存放對象的一個內存結構,當hibernate對對象進行操作的時候,僅僅改變的是對象的屬性,改變的是一級緩存中的對象的屬性,在session.flush之前的代碼可以任意寫,因爲這個時候,並沒有和數據庫交互。當執行session.flush的時候,hibernate會檢查一級緩存中的對象的情況,發出insert或者update語句。
二級緩存:
策略;(1)條件查詢時,總是發出一條select * from table_name where….(選擇所有字段)這樣的SQL語句查詢數據表,一次獲得所有的數據對象
(2)把獲得的所有數據對象根據ID放入到二級緩存中
(3)當Hibernate根據ID訪問數據對象是,首先從Session一級緩存中查,查不到,如果配置了二級緩存,那麼衝二級緩存中查,查不到,再查詢數據庫,把結果按照ID放入到緩存中
(4)刪除,更新,增加數據時,同時更新緩存

待續。。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章