Hibernate有那么多的優(yōu)點(diǎn),那么這些優(yōu)點(diǎn)在我們的應(yīng)用開發(fā)中是如何體現(xiàn)呢,確切的說(shuō)我們不是因?yàn)樗餍卸盟且驗(yàn)樗芙o我們的開發(fā)帶來(lái)幫助,能提高系統(tǒng)的性能。
Hibernate是持久層的框架,那就的先從持久層說(shuō)起。看看我們通常的持久層是如何做的。
1. 關(guān)于持久層的介紹:
MVC作為主流的系統(tǒng)架構(gòu)模式,已被越來(lái)越多的開發(fā)者所使用。MVC中的M,也就是Model則包含著大量的業(yè)務(wù)邏輯和數(shù)據(jù)邏輯,持久層作為Model中的重要組成,其設(shè)計(jì)的優(yōu)劣將對(duì)系統(tǒng)的整體表現(xiàn)產(chǎn)生至關(guān)重要的影響。
“持久層”,也就是在系統(tǒng)邏輯層面上,專注于實(shí)現(xiàn)數(shù)據(jù)持久化(對(duì)內(nèi)存的數(shù)據(jù)進(jìn)行固化,通常指保存至住據(jù)庫(kù))的一個(gè)相對(duì)獨(dú)立的領(lǐng)域。也就意味著,我們的系統(tǒng)架構(gòu)中,因該有一個(gè)相對(duì)獨(dú)立的邏輯層面,專注于數(shù)據(jù)持久化邏輯的實(shí)現(xiàn),與系統(tǒng)其他部門相對(duì)而言,這個(gè)層面應(yīng)該擁有一個(gè)較為清晰和嚴(yán)格的邏輯邊界。
2. 持久層的設(shè)計(jì)
場(chǎng)景:(在“深入淺出Hibernate”中一個(gè)非常好的例子),用戶進(jìn)入網(wǎng)上商店進(jìn)行購(gòu)物結(jié)算,那么他有以下的業(yè)務(wù)處理邏輯。
1)根據(jù)客戶ID取出客戶當(dāng)前等級(jí)(如,普通會(huì)員,VIP)
2)根據(jù)客戶等級(jí)獲得打折比率。
3)根據(jù)總金額 × 打著比率計(jì)算到實(shí)際支付的金額。
4)將本次實(shí)際的支付的金額累積到客戶累計(jì)消費(fèi)金額的字段中。
5)返回實(shí)際金額。
A方法,有的朋友可能這樣處理:
public calss NetShop {
......
/*
* 購(gòu)物結(jié)算
*/
public BigDecimal balance(String userID) {
conn = ......
try {
//獲取當(dāng)前等級(jí), select
......
} catch () { }
try {
//獲得打折比率, select
//計(jì)算實(shí)際支付金額
......
} catch () { }
try {
//將支付的金額累計(jì)到累積消費(fèi)中, update
//修改客戶現(xiàn)有的余額
......
} catch () {}
//返回實(shí)際的消費(fèi)金額
return new BigDecimal(****);
}
}
B. 那另外的一些朋友他們會(huì)說(shuō),在A里面混雜的業(yè)務(wù)邏輯和數(shù)據(jù)訪問代碼極大的干擾了閱讀程序的人,而且這樣的代碼將給日后的維護(hù)帶來(lái)極大的困難(我也是這樣認(rèn)為哦 ~ ~)。如果我們的實(shí)際應(yīng)用當(dāng)中的業(yè)務(wù)邏輯變得非常龐大和復(fù)雜的時(shí)候,A的做法顯然有憂缺點(diǎn)的。于是,就有了下面的改造:
public calss NetShop {
......
/*
* 購(gòu)物結(jié)算
*/
public BigDecimal balance(String userID) {
A a = new A();
String gradeStr = null; //客戶級(jí)別
long agioLong = 0.0;
//獲取當(dāng)前等級(jí)
gradeStr = a.getUserGarde(userID);
//根據(jù)等級(jí)計(jì)算打折比率
agioLong = a.getAgio(gradeStr);
//累計(jì)客戶消費(fèi)金額
a.updateCustMoney(userID, agioLong);
//修改客戶余額
a.updateUserBalance(userID, agioLong);
//返回消費(fèi)金額
return new BigDecimal(****);
}
}
public class A {
//去實(shí)現(xiàn)上面對(duì)方法
}
可以說(shuō)B的實(shí)現(xiàn)方式,是我(呵呵,大多數(shù)可不敢亂說(shuō))經(jīng)常使用的方式,在實(shí)際的應(yīng)用當(dāng)中結(jié)合一些數(shù)據(jù)庫(kù)性能上的優(yōu)化(連接池,預(yù)編譯語(yǔ)句之類的),基本上已經(jīng)實(shí)現(xiàn)了,業(yè)務(wù)和數(shù)據(jù)層的分離。
然而,在現(xiàn)在客戶的應(yīng)用需求和公司考慮可重用等因素的影響下,我們有不得不去考慮,我們的應(yīng)用能不能實(shí)現(xiàn)嚴(yán)格意義上的跨數(shù)據(jù)庫(kù)使用,或者說(shuō),我們的應(yīng)用從一個(gè)數(shù)據(jù)遷移到另外一個(gè)數(shù)據(jù)的時(shí)候,是不是只做很少的改動(dòng)(因?yàn)椋F(xiàn)在有很多的項(xiàng)目需要引入第三方的產(chǎn)品,它山之石可以攻玉嘛)。帶著這樣的疑問,那我們是不是會(huì)寫很多的基于特定數(shù)據(jù)庫(kù)的數(shù)據(jù)層處理代碼(當(dāng)然了,這也是個(gè)好辦法)。現(xiàn)在我們就要引入Hibernate了,我覺得選擇一個(gè)比我們自己的實(shí)現(xiàn)方式更好的實(shí)現(xiàn)方式,是一個(gè)更加聰明的決策。那么Hibernate能干什么?
1)減少乏味的代碼
無(wú)論是A方法還是B方法我們都少不了大量的數(shù)據(jù)庫(kù)連接,查詢,關(guān)閉等代碼,寫得多了也就覺得煩了,Hibernate封裝了數(shù)據(jù)庫(kù)持久層大多數(shù)技術(shù)細(xì)節(jié),如事物管理,連接管理,sql執(zhí)行等。
至少這點(diǎn),我們是需要的。
2)更加面向?qū)ο蟮脑O(shè)計(jì)
就是說(shuō)像設(shè)計(jì)對(duì)象一樣的去設(shè)計(jì)和操作數(shù)據(jù)庫(kù)。這條可能現(xiàn)在還不能理解。
3)更好的性能
我覺得這條好理解多了,系出名門和專家之手的框架,肯定提供了非常優(yōu)秀的性能優(yōu)化機(jī)制。比如,對(duì)連接池,PreparedSatatement 緩存,數(shù)據(jù)緩存等。這點(diǎn)我們可以大可放心,因?yàn)槭褂谜邲Q定了它的優(yōu)秀。
4)更好的移植性
我們只需要簡(jiǎn)單得修改其的配置參數(shù),即可實(shí)現(xiàn)底層數(shù)據(jù)庫(kù)的良好切換(這也是有前提的哦,可不能使用特定數(shù)據(jù)庫(kù)都有的特性)。這條的好處是顯而易見的。
關(guān)于引入Hibernate有什么好處,我覺得以上就足夠了,它確實(shí)能幫助我們。