CowNew開(kāi)源團(tuán)隊(duì)網(wǎng)站 http://www.cownew.com
論壇??? http://www.cownew.com/newpeng/
轉(zhuǎn)載請(qǐng)注明此版權(quán)信息。
ORM在整個(gè)java社區(qū)使用越來(lái)越廣泛,但是隨著更多的項(xiàng)目使用ORM,很多人也感到了它的不足:慢,甚至慢的讓人無(wú)法忍受!可是讓我們從ORM的原理仔細(xì)思考一下,就會(huì)發(fā)現(xiàn),使用ORM并不會(huì)明顯降低運(yùn)行速度。因?yàn)闊o(wú)論什么ORM工具都是根據(jù)對(duì)象去動(dòng)態(tài)構(gòu)造SQL語(yǔ)句,執(zhí)行的,相信無(wú)論構(gòu)造SQL的速度多么慢,那和數(shù)據(jù)庫(kù)操作比起來(lái),幾乎是可以忽略不計(jì)的。但是為什么確實(shí)又那么慢呢?歸根結(jié)底,是對(duì)ORM的使用不當(dāng)造成的。
1、陋習(xí):過(guò)渡依賴ORM的Update和delete。比如,將某個(gè)人的年齡加3,很多人就會(huì)如下寫:
PersonInfo p = orm.getPerson(...);
p.setAge(p.getAge);
orm.update(p);
看看,這一來(lái)一回就要兩個(gè)sql語(yǔ)句,先取數(shù)據(jù):select age,id,.... from T_Person,然后再update,update T_Person set age=23....。
相信沒(méi)有ORM,誰(shuí)也不會(huì)去這么寫。直接寫sql:update T_Person set age=age+3 where...這不很好嗎?速度不會(huì)快多了嗎?
又如:刪除年齡為15的人,有的人就敢這么寫:
PersonInfo persons[] = orm.getPersons("age=15");
for(int i=0,n=persons.length;i<n;i++)
{
?? orm.delete(persons[i]);
}
我真的要瘋了,它真的不懂delete from T_person where age=15嗎??
根據(jù)我個(gè)人的經(jīng)驗(yàn)如果要發(fā)揮ORM的最大作用,同時(shí)最大程度的避免其副作用,我建議最好只使用orm的addNew(增加數(shù)據(jù))和get***Info(從數(shù)據(jù)庫(kù)中取數(shù)據(jù))的功能,而對(duì)update,delete則直接寫sql,這樣最好。
ORM+JDBC,優(yōu)美和效率的最佳結(jié)合點(diǎn)。
2、認(rèn)為ORM萬(wàn)能。在寫一些報(bào)表的時(shí)候甚至也有人用orm取出數(shù)據(jù),然后通過(guò)代碼來(lái)出報(bào)表。相信稍微復(fù)雜一點(diǎn)的報(bào)表就能把人搞死。所以報(bào)表,千萬(wàn)不能用ORM,直接寫SQL是最好的事情。