Hibernate之底層原理的7點(diǎn)整理和總結(jié)

開心一笑

【老婆想減肥,讓老公幫她買減肥藥鞋怀,老公:吃藥傷身双泪,現(xiàn)在挺好,多有肉感啊密似。兒子:其實(shí)真有點(diǎn)胖焙矛,老公立刻瞪了兒子一眼:小孩子不知道別亂講,你媽媽這身材我喜歡残腌。然后村斟,趁老婆不注意狠狠的教訓(xùn)了兒子:以后說話注意點(diǎn),減肥藥很貴的抛猫,你要告訴你媽蟆盹,少吃點(diǎn)飯不就減下去了。都是套路啊......】

提出問題

關(guān)于Hibernate闺金,個人的7點(diǎn)簡單整理和總結(jié)???

唯美圖片

解決問題

1.Hibernate簡單介紹

Hibernate是一個開放源代碼的對象關(guān)系映射框架逾滥,它對JDBC進(jìn)行了非常輕量級的對象封裝,它將POJO與數(shù)據(jù)庫表建立映射關(guān)系败匹,是一個全自動的orm框架寨昙,hibernate可以自動生成SQL語句讥巡,自動執(zhí)行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫舔哪。

**2.Hibernate的優(yōu)缺點(diǎn) **

2.1 優(yōu)點(diǎn)

  • 程序更加面向?qū)ο螅?/li>
  • 提高了生產(chǎn)率欢顷;
  • 方便移植(修改配置文件);
  • 無侵入性尸红。

2.2 缺點(diǎn)

  • 效率比JDBC略差吱涉;
  • 不適合批量操作。
  • 只能配置一種關(guān)聯(lián)關(guān)系

2.3 無入侵性

簡單理解外里,所謂侵入性,是指它沒有侵入hibernate任何的API特石。完全采用普通的Java對象(POJO)盅蝗,而不必繼承Hibernate的某個基類,或?qū)崿F(xiàn)Hibernate的某個接口姆蘸。

例如 : A是侵入性的墩莫,B代碼中使用A,那么如果以后不用A了(用另外一個工具代替)逞敷,必須修改B的代碼狂秦。反之,如果A是非侵入性的推捐,B不用A裂问,用C了,代碼不需要改牛柒,改改配置文件什么的堪簿,就可以了。

**3.Hibernate有四種查詢方案 **

3.1 根據(jù)ID查詢

根據(jù)get,load方法皮壁,根據(jù)id查找對象椭更。

例如:

load(Class theClass, Serializable id) 
load(Class theClass, Serializable id, LockMode lockMode)
load(Object object, Serializable id)  

3.2 HQL語句進(jìn)行查詢

HQL(hibernate query language),查詢對象:Query蛾魄。Query由Session里的createQuery()來產(chǎn)生一個查詢虑瀑。

例如:

 //不帶參數(shù)的查詢(這類比較簡單)
 Query query=session.createQuery("select user from User as user");

 //第一種帶參數(shù)的查詢
 Query query=session.createQuery("select user from User as user where user.name=?");
 //假設(shè)name為傳過來的參數(shù)
 query.setString(0,name)

 //第二種帶參數(shù)的查詢
 Query query=session.createQuery("select user from User as user where user.name=:name");
 query.setString("name",name)//假設(shè)name為傳過來的參數(shù)(多個參數(shù)以此類推)  
 
        
利用Session接口的find查詢,均返回list 
find(String query) 
find(String query, Object[] values, Type[] types) 
find(String query, Object value, Type type)      
//例如下面
List list=session.find("select user from Users as user where user.name=?",name,Hibernate.STRING)
List list=session.find("select user from Users as user where user.name=? and             user.pw=?",new Object[]{name,pw},new Type[]{Hibernate.STRING,Hibernate.STRING})

3.3 Criteria查詢

Criteria(標(biāo)準(zhǔn)查詢語言)滴须,查詢對象:Criteria舌狗,查詢條件:Criterion。

具體實(shí)例如下:省略 User 類

@Test  
public void test() {  
    // 獲取Criteria實(shí)例對象  
    Criteria criteria = session.createCriteria(User.class);  
  
    // 查詢出王姓員工且收入在3000到5000之間的  
    // 類似于HQL中 WHERE employeeName LIKE '王%' AND salary BETWEEN 3000 AND 5000  
    List emps = criteria.add(Restrictions.like("employeeName", "王%"))  
            .add(Restrictions.between("salary", 3000.0, 5000.0)).list();  
  
    // 查詢出工資在4000以下或5000以上的王姓員工  
    // 可以通過Restrictions的or或and進(jìn)行邏輯分組  
    emps = criteria.add(Restrictions.like("employeeName", "王%"))  
            .add(Restrictions.or(Restrictions.gt("salary", 5000D), Restrictions.lt("salary", 3000D))).list();  
  
    // 查詢出崗位是軟件工程師或測試工程師描馅,且學(xué)歷是碩士把夸、本科或大專的員工有哪些  
    emps = criteria.add(Restrictions.in("position", new String[] { "軟件工程師", "測試工程師" }))  
            .add(Restrictions.disjunction().add(Restrictions.eq("degree", "碩士")).add(Restrictions.eq("degree", "本科"))  
            .add(Restrictions.eq("degree", "大專")))  
            .list();  
}  

更多的細(xì)節(jié),請看下面網(wǎng)絡(luò)上的大神文章铭污,這里不繼續(xù)擴(kuò)展恋日。

3.4 通過SQL來查

查詢對象:SQLQuery

Session.createSQLQuery();

最基本的SQL查詢就是獲得一個標(biāo)量(數(shù)值)的列表

Session.createSQLQuery("SELECT * FROM CATS").list();
Session.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();

下面展示如何通過 addEntity() 讓原生查詢返回實(shí)體對象膀篮。

Session.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);
Session.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);

更多的細(xì)節(jié),請看下面網(wǎng)絡(luò)上的大神文章岂膳,這里不繼續(xù)擴(kuò)展誓竿。

4.Hibernate的工作原理和初始化

4.1工作原理

  • 配置好hibernate的配置文件和與類對應(yīng)的配置文件后,啟動服務(wù)器
  • 服務(wù)器通過實(shí)例化Configuration對象谈截,讀取hibernate.cfg.xml文件的配置內(nèi)容筷屡,并根據(jù)相關(guān)的需求建好表或者和表建立好映射關(guān)系
  • 通過實(shí)例化的Configuration對象就可以建立sessionFactory實(shí)例,進(jìn)一步簸喂,通過sessionFactory實(shí)例可以創(chuàng)建 session對象
  • 得到session之后毙死,便可以對數(shù)據(jù)庫進(jìn)行增刪改查操作了,除了比較復(fù)雜的全文搜索外喻鳄,簡單的操作都可以通過hibernate封裝好的 session內(nèi)置方法來實(shí)現(xiàn)
  • 此外扼倘,還可以通過事物管理,表的關(guān)聯(lián)來實(shí)現(xiàn)較為復(fù)雜的數(shù)據(jù)庫設(shè)計(jì)
    優(yōu)點(diǎn):hibernate相當(dāng)于java類和數(shù)據(jù)庫表之間溝通的橋梁除呵,通過這座橋我們就可以做很多事情了

4.2 初始化

1.通過Configuration config = new Configuration().configure();//讀取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取并解析映射信息
3.通過SessionFactory sf = config.buildSessionFactory();//創(chuàng)建SessionFactory
4.Session session = sf.openSession();//打開Sesssion
5.Transaction tx = session.beginTransaction();//創(chuàng)建并啟動事務(wù)Transation
6.persistent operate操作數(shù)據(jù)再菊,持久化操作
7.tx.commit();//提交事務(wù)
8.關(guān)閉Session
9.關(guān)閉SesstionFactory

5.Hibernate的3種對象狀態(tài)

5.1 臨時狀態(tài)(或者叫瞬時狀態(tài)Transient)

由new命令開辟內(nèi)存空間的java對象,例如:

User user=new User();

臨時對象在內(nèi)存孤立存在,它是攜帶信息的載體,不和數(shù)據(jù)庫的數(shù)據(jù)有任何關(guān)聯(lián)關(guān)系。

5.2 持久狀態(tài)(Persistent)

該狀態(tài)的對象在數(shù)據(jù)庫中具有對應(yīng)的記錄,并擁有一個持久化標(biāo)識.通過session的 get()颜曾、load() 等方法獲得的對象都是持久對象纠拔。持久化對象被修改變更后,不會馬上同步到數(shù)據(jù)庫泛豪,直到數(shù)據(jù)庫事務(wù)提交稠诲。在同步之前,持久化對象是臟的候址。

5.3 游離狀態(tài)(或者叫脫管狀態(tài)Detached)

當(dāng)與某持久對象關(guān)聯(lián)的 session 被關(guān)閉后,該持久對象轉(zhuǎn)變?yōu)橛坞x對象.當(dāng)游離對象被重新關(guān)聯(lián)到session上 時,又再次轉(zhuǎn)變成持久對象(在Detached其間的改動將被持久化到數(shù)據(jù)庫中)吕粹。游離對象擁有數(shù)據(jù)庫的識別值,但已不在持久化管理范圍之內(nèi)。

6.Hibernate對象狀態(tài)轉(zhuǎn)換

6.1 轉(zhuǎn)換圖片

對象狀態(tài)

6.2 對象狀態(tài)轉(zhuǎn)換說明

臨時狀態(tài)或者瞬時狀態(tài) (transient)

  • 不處于Session 緩存中岗仑,存在內(nèi)存中
  • 數(shù)據(jù)庫中沒有對象記錄

Java如何進(jìn)入臨時狀態(tài)

  • 通過new語句剛創(chuàng)建一個對象時
  • 當(dāng)調(diào)用Session 的delete()方法匹耕,從 Session 緩存中刪除一個對象時。

持久化狀態(tài)(persisted)

  • 處于Session 緩存中荠雕。
  • 持久化對象數(shù)據(jù)庫中有對象記錄稳其。
  • Session 在特定時刻會保持二者同步。

Java如何進(jìn)入持久化狀態(tài)

  • Session 的save()把臨時 --->>> 持久化狀態(tài)炸卑。
  • Session 的load(),get()方法返回的對象既鞠。
  • Session 的find()返回的list集合中存放的對象。
  • Session 的update(),saveOrupdate()使游離 --->>> 持久化盖文。

游離狀態(tài)或者托管狀態(tài)(detached)

  • 不再位于 Session 緩存中.
  • 游離對象由持久化狀態(tài)轉(zhuǎn)變而來嘱蛋,數(shù)據(jù)庫中可能還有對應(yīng)記錄。

Java如何進(jìn)入持久化狀態(tài) --->>> 游離狀態(tài)

  • Session 的close()方法
  • Session 的evict()方法,從緩存中刪除一個對象洒敏,提高性能龄恋,少用。
這里寫圖片描述

7.Hibernate緩存

7.1為什么需要緩存

Hibernate是一個持久層框架凶伙,經(jīng)常訪問物理數(shù)據(jù)庫郭毕。為了降低應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源訪問的頻次,從而提高應(yīng)用程序的運(yùn)行性能函荣。緩存內(nèi)的數(shù)據(jù)是對物理數(shù)據(jù)源中的數(shù)據(jù)的復(fù)制显押,應(yīng)用程序在運(yùn)行時從緩存讀寫數(shù)據(jù),在特定的時刻或事件會同步緩存和物理數(shù)據(jù)源的數(shù)據(jù)傻挂。

7.2 Hibernate緩存分類

Hibernate一級緩存又稱為 Session 的緩存:

  • Session內(nèi)置不能被卸載
  • Session的緩存是事務(wù)范圍的緩存
  • Session對象的生命周期通常對應(yīng)一個數(shù)據(jù)庫事務(wù)或者一個應(yīng)用事務(wù)

Hibernate二級緩存又稱為“SessionFactory的緩存:

第二級緩存是可選的乘碑,是一個可配置的插件,默認(rèn)下SessionFactory不會啟用這個插件踊谋。

7.2 Hibernate緩存查詢機(jī)制

  • 當(dāng)Hibernate根據(jù)ID訪問數(shù)據(jù)對象的時候蝉仇,首先從Session一級緩存中查;
  • 查不到殖蚕,如果配置了二級緩存,那么從二級緩存中查沉迹;
  • 如果都查不到睦疫,再查詢數(shù)據(jù)庫,把結(jié)果按照ID放入到緩存
  • 刪除鞭呕、更新蛤育、增加數(shù)據(jù)的時候,同時更新緩存葫松。

讀書感悟

來自村上春樹《海邊的卡夫卡》

  • 從沙塵暴中逃出的你已不再是跨入沙塵暴時的你瓦糕。
  • “希望你記住我”,佐伯說腋么,“只要有你記住我咕娄,被其他所有人忘掉 都無所謂∩豪蓿”
  • 不能用語言準(zhǔn)確表達(dá)的東西圣勒,最好完全不說。
  • 人不是因其缺點(diǎn)摧扇,而是因其優(yōu)點(diǎn)被拖入更大的悲劇之中的圣贸。
  • 大凡事物必有順序,看的太超前了不行扛稽∮蹙看的太超前,勢必忽視腳下,人往往跌倒用含“剑可另一方面,光看腳下也不行耕餐。不看好前面凡傅,會撞上什么。所以么肠缔,要在多少往前看的同時按部就班處理眼下事物夏跷。這點(diǎn)至為關(guān)鍵,無論做什么明未。
  • 我們大家都在持續(xù)失去種種寶貴的東西槽华,寶貴的機(jī)會和可能性,無法挽回的感情趟妥,這是生存的一個意義猫态。
  • 如果擁有令人吃驚的了不起的想法的是你一個人,那么在深重的黑暗中往來彷徨的也必定是你一個人披摄。
  • 問乃一時之恥亲雪,不問乃一生之恥。

經(jīng)典故事

【一家酒店經(jīng)營得很好疚膊,人氣旺盛义辕、財源廣進(jìn)。酒店的老總準(zhǔn)備開展另外一項(xiàng)業(yè)務(wù)寓盗,由于沒有太多的精力管理這家酒店灌砖,打算在現(xiàn)有的三個部門經(jīng)理中物色一位總經(jīng)理。
老總問第一位部門經(jīng)理:“是先有雞還是先有蛋傀蚌?”
第一位部門經(jīng)理不加思索地答道:“先有雞基显。”
老總接著問第二位部門經(jīng)理:“是先有雞還是先有蛋善炫?”
第二位部門經(jīng)理胸有成竹地答道:“先有蛋撩幽。”
這時销部,老總向最后一位部門經(jīng)理說道:“你來說說摸航,是先有雞還是先有蛋?”
第三位部門經(jīng)理認(rèn)真地答道:“客人先點(diǎn)雞舅桩,就先有雞酱虎;客人先點(diǎn)蛋,就先有蛋擂涛《链”
老總笑了聊记。他決定將第三位部門經(jīng)理升任為這家酒店的總經(jīng)理。
【心語】就事論事恢暖,往往容易局限在一個小圈子里排监,這就是常說的:慣性思維“。跳不出來時杰捂,就找不到得理事情的正確方法舆床;相反,當(dāng)我們換個角度跳出原來的慣性思維的框框時嫁佳,我們就走上了一條新路挨队,即:柳暗花明又一春≥锿】

大神文章

【1】Hibernate 百度百科
【2】Hibernate面試知識點(diǎn)總結(jié)
【3】Hibernate查詢解決方案
【4】Hibernate之Criteria查詢
【5】Hibernate原生SQL查詢
【6】Hibernate SQLQuery 原生SQL 查詢及返回結(jié)果集處理-1
【7】hibernate工作原理及作用
【8】Hibernate的層次劃分盛垦,Hibernate4.3的初始化的新寫法
【9】(轉(zhuǎn)) Hibernate對象的三種狀態(tài)
【10】Hibernate中對象的三種狀態(tài)及相互轉(zhuǎn)化
【11】Hibernate 緩存機(jī)制

其他

如果有帶給你一絲絲小快樂,就讓快樂繼續(xù)傳遞下去瓤漏,歡迎點(diǎn)贊腾夯、頂、歡迎留下寶貴的意見蔬充、多謝支持蝶俱!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伟桅,一起剝皮案震驚了整個濱河市劫映,隨后出現(xiàn)的幾起案子儒将,更是在濱河造成了極大的恐慌儒飒,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扛吞,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)皿哨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纽谒,“玉大人证膨,你說我怎么就攤上這事」那” “怎么了央勒?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澳化。 經(jīng)常有香客問我崔步,道長,這世上最難降的妖魔是什么缎谷? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任井濒,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瑞你。我一直安慰自己酪惭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布者甲。 她就那樣靜靜地躺著春感,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虏缸。 梳的紋絲不亂的頭發(fā)上鲫懒,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音寇钉,去河邊找鬼刀疙。 笑死,一個胖子當(dāng)著我的面吹牛扫倡,可吹牛的內(nèi)容都是我干的谦秧。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼撵溃,長吁一口氣:“原來是場噩夢啊……” “哼疚鲤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缘挑,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤集歇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后语淘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诲宇,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年惶翻,在試婚紗的時候發(fā)現(xiàn)自己被綠了姑蓝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡吕粗,死狀恐怖纺荧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颅筋,我是刑警寧澤宙暇,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站议泵,受9級特大地震影響占贫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肢簿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一靶剑、第九天 我趴在偏房一處隱蔽的房頂上張望蜻拨。 院中可真熱鬧,春花似錦桩引、人聲如沸缎讼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽血崭。三九已至,卻和暖如春厘灼,著一層夾襖步出監(jiān)牢的瞬間夹纫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工设凹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舰讹,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓闪朱,卻偏偏與公主長得像月匣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奋姿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容