大家好,我是IT修真院成都分院第7期的JAVA學(xué)員龔劍飛绵估,一枚正直純潔善良的java程序員。
今天給大家分享一下卡骂,一個(gè)比較好用的ORM框架————Hibernate国裳。
1.背景介紹
先介紹下背景
Hibernate是什么?
Hibernate全跨,翻譯過(guò)來(lái)是冬眠的意思缝左,正好現(xiàn)在已經(jīng)進(jìn)入秋季,世間萬(wàn)物開(kāi)始準(zhǔn)備冬眠了。其實(shí)對(duì)于對(duì)象來(lái)說(shuō)就是持久化渺杉。
ORM蛇数,即Object-Relational Mapping,它的作用就是在關(guān)系型數(shù)據(jù)庫(kù)和對(duì)象之間做了一個(gè)映射是越。從對(duì)象(Object)映射到關(guān)系(Relation)耳舅,再?gòu)年P(guān)系映射到對(duì)象。這樣倚评,我們?cè)诓僮鲾?shù)據(jù)庫(kù)的時(shí)候浦徊,不需要再去和復(fù)雜SQL打交道,只要像操作對(duì)象一樣操作它就可以了(把關(guān)系數(shù)據(jù)庫(kù)的字段在內(nèi)存中映射成對(duì)象的屬性)天梧。
Hibernate的產(chǎn)生背景:
大多數(shù)應(yīng)用程序都需要處理數(shù)據(jù)盔性。Java應(yīng)用程序運(yùn)行時(shí),往往把數(shù)據(jù)封裝為相互連接的對(duì)象網(wǎng)絡(luò)呢岗,但是當(dāng)程序結(jié)束時(shí)冕香,這些對(duì)象就會(huì)消失在一團(tuán)邏輯中,所以需要有一些保存它們的方法后豫。有時(shí)候悉尾,甚至在編寫(xiě)應(yīng)用程序之前,數(shù)據(jù)就已經(jīng)存在了硬贯,所以需要有讀入它們和將其表示為對(duì)象的方法焕襟。手動(dòng)編寫(xiě)代碼來(lái)執(zhí)行這些任務(wù)不僅單調(diào)乏味、易于出錯(cuò)饭豹,而且會(huì)占用整個(gè)應(yīng)用程序的很大一部分開(kāi)發(fā)工作量鸵赖。
Gavin King開(kāi)發(fā)hibernate的動(dòng)機(jī)有兩個(gè):發(fā)現(xiàn)CMP太爛;贏得對(duì)老板的爭(zhēng)執(zhí)拄衰。Gavin King當(dāng)時(shí)沒(méi)有任何用SQL開(kāi)發(fā)數(shù)據(jù)庫(kù)的經(jīng)驗(yàn)它褪,Gavin King開(kāi)發(fā)hibernate的第一件事是去街上買(mǎi)了本SQL基礎(chǔ)的書(shū)
2.知識(shí)剖析
執(zhí)行流程
Configuration接口:負(fù)責(zé)配置并啟動(dòng)Hibernate
SessionFactory接口:負(fù)責(zé)初始化Hibernate
Session接口:負(fù)責(zé)持久化對(duì)象的CRUD操作
Transaction接口:負(fù)責(zé)事務(wù)
Query接口和Criteria接口:負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫(kù)查詢(xún)
3.常見(jiàn)問(wèn)題
如何操作Hibernate?
4.解決方案
來(lái)給大家演示一下基本操作
5.編碼實(shí)戰(zhàn)
6.擴(kuò)展思考
Mybatis同樣也是非常流行的ORM框架翘悉,主要著力點(diǎn)在于 POJO 與 SQL 之間的映射關(guān)系茫打。然后通過(guò)映射配置文件,將SQL所需的參數(shù)妖混,以及返回的結(jié)果字段映射到指定 POJO 老赤。相對(duì)Hibernate“O/R”而言,Mybatis 是一種“Sql Mapping”的ORM實(shí)現(xiàn)制市。
Hibernate優(yōu)勢(shì)
Hibernate的DAO層開(kāi)發(fā)比MyBatis簡(jiǎn)單抬旺,Mybatis需要維護(hù)SQL和結(jié)果映射。
Hibernate對(duì)對(duì)象的維護(hù)和緩存要比MyBatis好祥楣,對(duì)增刪改查的對(duì)象的維護(hù)要方便开财。
Hibernate數(shù)據(jù)庫(kù)移植性很好汉柒,MyBatis的數(shù)據(jù)庫(kù)移植性不好,不同的數(shù)據(jù)庫(kù)需要寫(xiě)不同SQL责鳍。
Hibernate有更好的二級(jí)緩存機(jī)制碾褂,可以使用第三方緩存。MyBatis本身提供的緩存機(jī)制不佳历葛。
Mybatis優(yōu)勢(shì)
MyBatis可以進(jìn)行更為細(xì)致的SQL優(yōu)化正塌,可以減少查詢(xún)字段。
MyBatis容易掌握啃洋,而Hibernate門(mén)檻較高传货。
7.參考文獻(xiàn)
CSDN博客
8.更多討論
問(wèn):hibernate和mybatis的主要區(qū)別是什么?
答:hibernate更重,一些簡(jiǎn)單的語(yǔ)句不用自己寫(xiě)宏娄。
MyBatis要輕量化一些问裕,sqlmapper是必須自己寫(xiě)的
問(wèn):講一下orm
對(duì)象關(guān)系映射,其實(shí)就是把JAVA代碼中的一個(gè)類(lèi)孵坚,和數(shù)據(jù)庫(kù)中的一張表相對(duì)應(yīng)
問(wèn):load()和get()的區(qū)別
load是延遲加載粮宛,get是立即加載。
問(wèn):hibernate的全自動(dòng)體現(xiàn)在什么方面
體現(xiàn)在如果你只用簡(jiǎn)單的語(yǔ)句卖宠,是不用自己寫(xiě)的
問(wèn):說(shuō)下Hibernate的緩存機(jī)制
evit(Object obj)將指定的持久化對(duì)象從一級(jí)緩存中清除,釋放對(duì)象所占用的內(nèi)存資源,指定對(duì)象從持久化狀態(tài)變?yōu)槊摴軤顟B(tài),從而成為游離對(duì)象巍杈。
clear()將一級(jí)緩存中的所有持久化對(duì)象清除,釋放其占用的內(nèi)存資源。
contains(Object obj)判斷指定的對(duì)象是否存在于一級(jí)緩存中扛伍。
flush()刷新一級(jí)緩存區(qū)的內(nèi)容,使之與數(shù)據(jù)庫(kù)數(shù)據(jù)保持同步筷畦。
try{/*開(kāi)啟一個(gè)事務(wù)*/tx=session.beginTransaction();/*從數(shù)據(jù)庫(kù)中獲取id="402881e534fa5a440134fa5a45340002"的Customer對(duì)象*/Customer customer1= (Customer)session.get(Customer.class, "402881e534fa5a440134fa5a45340002");
System.out.println("customer.getUsername is"+customer1.getUsername());/*事務(wù)提交*/tx.commit();
System.out.println("-------------------------------------");/*開(kāi)啟一個(gè)新事務(wù)*/tx=session.beginTransaction();/*從數(shù)據(jù)庫(kù)中獲取id="402881e534fa5a440134fa5a45340002"的Customer對(duì)象*/Customer customer2= (Customer)session.get(Customer.class, "402881e534fa5a440134fa5a45340002");
System.out.println("customer2.getUsername is"+customer2.getUsername());/*事務(wù)提交*/tx.commit();
System.out.println("-------------------------------------");/*比較兩個(gè)get()方法獲取的對(duì)象是否是同一個(gè)對(duì)象*/System.out.println("customer1 == customer2 result is "+(customer1==customer2));
}
customer1== customer2 result istrue
今天的分享就到這里啦,歡迎大家點(diǎn)贊刺洒、轉(zhuǎn)發(fā)鳖宾、留言、拍磚~
技能樹(shù).IT修真院“我們相信人人都可以成為一個(gè)工程師逆航,現(xiàn)在開(kāi)始鼎文,找個(gè)師兄,帶你入門(mén)因俐,掌控自己學(xué)習(xí)的節(jié)奏拇惋,學(xué)習(xí)的路上不再迷茫”抹剩。
這里是技能樹(shù).IT修真院撑帖,成千上萬(wàn)的師兄在這里找到了自己的學(xué)習(xí)路線(xiàn),學(xué)習(xí)透明化澳眷,成長(zhǎng)可見(jiàn)化胡嘿,師兄1對(duì)1免費(fèi)指導(dǎo)【嘲快來(lái)與我一起學(xué)習(xí)吧~我的邀請(qǐng)碼:13869506灶平,或者你可以直接點(diǎn)擊此鏈接:http://www.jnshu.com/login/1/13869506