開心一笑
【老婆想減肥,讓老公幫她買減肥藥鞋怀,老公:吃藥傷身双泪,現(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)換圖片
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)贊腾夯、頂、歡迎留下寶貴的意見蔬充、多謝支持蝶俱!