轉(zhuǎn)帖|其它|編輯:郝浩|2010-07-26 11:55:09.000|閱讀 583 次
概述:雖然Java領(lǐng)域有無數(shù)的ORM框架,如Hibernate,iBatis,TopLink,JDO,JPA…… 但是這些ORM框架基本上大同小異。很多初學(xué)者對(duì)JDBC的復(fù)雜性望而卻步,就簡單認(rèn)為使用ORM就會(huì)省時(shí)省力,結(jié)果恰恰相反,任何好的框架都是給專家準(zhǔn) 備的,任何急功近利試圖偷懶的方法往往適得其反。要正確使用ORM還真不是一件簡單的事情。本文僅簡單整理一下ORM的原理,基本用法,以及如何避免各種陷阱的基本編程原則。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
雖然Java領(lǐng)域有無數(shù)的ORM框架,如Hibernate,iBatis,TopLink,JDO,JPA…… 但是這些ORM框架基本上大同小異。很多初學(xué)者對(duì)JDBC的復(fù)雜性望而卻步,就簡單認(rèn)為使用ORM就會(huì)省時(shí)省力,結(jié)果恰恰相反,任何好的框架都是給專家準(zhǔn) 備的,任何急功近利試圖偷懶的方法往往適得其反。要正確使用ORM還真不是一件簡單的事情。本文僅簡單整理一下ORM的原理,基本用法,以及如何避免各種 陷阱的基本編程原則。
ORM的原理
先說ORM的實(shí)現(xiàn)原理。其實(shí),要實(shí)現(xiàn)JavaBean的屬性到數(shù)據(jù)庫表的字段的映射,任何ORM框架不外乎是讀某個(gè)配置文件把JavaBean的屬 性和數(shù)據(jù)庫表的字段自動(dòng)關(guān)聯(lián)起來,當(dāng)從數(shù)據(jù)庫Query時(shí),自動(dòng)把字段的值塞進(jìn)JavaBean的對(duì)應(yīng)屬性里,當(dāng)做INSERT或UPDATE時(shí),自動(dòng)把 JavaBean的屬性值綁定到SQL語句中。但是,幾乎所有的ORM都提供“按需讀取”的功能,比如一個(gè)User有id,name,email和 address這4個(gè)字段,但是address字段很少用,于是ORM只讀取前3個(gè)字段,直到調(diào)用User的getAddress()方法時(shí),才去數(shù)據(jù)庫 中讀取address的值。這個(gè)功能顯然不能通過User的get/set完成,因此,ORM需要采用某種方式生成一個(gè)User類的子類,并且覆寫get /set方法,這樣,才能在調(diào)用get方法時(shí)有機(jī)會(huì)從數(shù)據(jù)庫中讀取。類似的對(duì)User的修改檢測(cè)也是這樣實(shí)現(xiàn)的。
兩種增強(qiáng)的方式
ORM為我們自己的JavaBean實(shí)現(xiàn)子類的方法很多,這個(gè)過程簡單稱之為“增強(qiáng)”,基本上有兩種方法:Hibernate使用CGLIB在加載 我們的User類時(shí)動(dòng)態(tài)創(chuàng)建了一個(gè)子類,而JDO則要求編譯完User類后再利用它提供的工具對(duì)User類進(jìn)行改造,以便實(shí)現(xiàn)JDO需要的各種接口。請(qǐng)注意:就是這種極其變態(tài)的設(shè)計(jì)導(dǎo)致了使用JDO的極大困難,在我們編譯完源碼后,還需要額外執(zhí)行一個(gè)增強(qiáng)命令,或者額外編寫Ant任務(wù),極大地影響了快速開發(fā)和單元測(cè)試,所以,凡是采用靜態(tài)生成持久類的ORM,要在第一時(shí)間直接排除。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載