? ? ? ?在做邏輯的推演時(shí),首先我們要確定一個(gè)準(zhǔn)確無(wú)誤的二庵、一般性的原則作為前提。只有保證這個(gè)前提是絕對(duì)的缓呛、無(wú)差別的催享,才能夠證明結(jié)論是正確的,整個(gè)邏輯的論證才是可信的哟绊。因此無(wú)論任何科學(xué)因妙,找到一個(gè)絕對(duì)的、一般性的指導(dǎo)原則是迫切和必須的票髓。沒(méi)有這個(gè)原則攀涵,一切研究將是毫無(wú)意義的。就像斯威夫特在他的《格列佛游記》中諷刺的那樣:“他們終其一生在進(jìn)行研究洽沟,研究從黃瓜中提取陽(yáng)光以故,將大便還原為食物”。我們的時(shí)代也不斷在進(jìn)行這樣的研究裆操,研究用水來(lái)代替石油怒详,去太空中尋找反物質(zhì)。這些研究無(wú)疑都取得了巨大的成功踪区,獲得了大量的經(jīng)費(fèi)昆烁,堪稱(chēng)騙術(shù)界的楷模與典范。但也僅此而已缎岗,這種成功是時(shí)代的成功静尼,而非歷史的成功。歷史終將剔除一切虛妄的東西传泊,回歸真實(shí)鼠渺。“我從這里開(kāi)始眷细;因?yàn)槲覍⒅匦禄氐竭@里拦盹。”——巴門(mén)尼德《論自然》
? ? ? ? 一切科學(xué)都是有一個(gè)確定無(wú)誤的前提的薪鹦,例如幾何學(xué)研究物質(zhì)的形狀掌敬,點(diǎn)的概念構(gòu)成了整個(gè)幾何學(xué)的基礎(chǔ);數(shù)學(xué)研究物質(zhì)的量池磁,它的理論基礎(chǔ)實(shí)際上是建立在差異性上的奔害,也就是說(shuō),承認(rèn)每一個(gè)都是一地熄,而不是多华临。只有這樣再做四則運(yùn)算時(shí),1+1才會(huì)等于2端考。計(jì)算機(jī)科學(xué)當(dāng)然有它的特殊性:我們研究的東西并非是自在的存在著雅潭,而是人類(lèi)思維的產(chǎn)物,是人類(lèi)生產(chǎn)力發(fā)展的產(chǎn)物却特。甚至可以說(shuō)扶供,它更像是一門(mén)技術(shù),而非科學(xué)裂明。它的存在是為了解決人類(lèi)事務(wù)中的一些問(wèn)題椿浓,因此也會(huì)受到人類(lèi)事務(wù)的一般規(guī)則的約束。在這門(mén)學(xué)科不斷的發(fā)展中闽晦,它嘗試著模擬現(xiàn)實(shí)世界扳碍,從機(jī)器語(yǔ)言一直到現(xiàn)在的高級(jí)計(jì)算機(jī)語(yǔ)言,它更加表現(xiàn)出科學(xué)的性質(zhì)仙蛉。我們現(xiàn)在所了解的設(shè)計(jì)模式笋敞、一些設(shè)計(jì)原則,全部是建立在高等計(jì)算機(jī)語(yǔ)言上的荠瘪。java語(yǔ)言毫無(wú)疑問(wèn)是比較優(yōu)秀的計(jì)算機(jī)語(yǔ)言之一夯巷,它的面向?qū)ο蟮脑O(shè)計(jì)思想使我們可以研發(fā)出可以輕松處理復(fù)雜事務(wù)軟件。它將現(xiàn)實(shí)世界中抽象的哀墓、一般的行為描述為類(lèi)鞭莽,而將某個(gè)類(lèi)特殊的實(shí)例稱(chēng)之為對(duì)象。就像現(xiàn)實(shí)世界中有“人”的抽象的概念麸祷,而張三這個(gè)具體的人則是“人”這個(gè)類(lèi)的具體實(shí)現(xiàn)澎怒。java的設(shè)計(jì)思想繼承了C、C++阶牍。繼承在英文中叫做extends喷面,有繼承和擴(kuò)展的意思,與中文中的繼承有著很大的不同走孽,更多的表現(xiàn)為擴(kuò)展惧辈。也就是說(shuō)java揚(yáng)棄了C++的某些東西,而成為現(xiàn)在的語(yǔ)言磕瓷。
? ? ? ? hibernate嘗試在這一點(diǎn)上走的更遠(yuǎn)盒齿,它提出并實(shí)踐了ORM(對(duì)象關(guān)系映射)這一思想念逞,試圖將所有的問(wèn)題描述為類(lèi)和對(duì)象的關(guān)系。這是有很積極意義的边翁。hibernate的思想得以實(shí)現(xiàn)翎承,很大程度上依賴(lài)于JDK的反射技術(shù)。通過(guò)反射符匾、XML解析叨咖、注解,它可以很容易的將數(shù)據(jù)庫(kù)表映射為一個(gè)對(duì)象啊胶,并且通過(guò)標(biāo)記對(duì)象的狀態(tài)來(lái)判斷對(duì)象的行為(框架的技術(shù)細(xì)節(jié)不在該篇進(jìn)行討論)甸各。hibernate旨在提供給開(kāi)發(fā)人員一個(gè)標(biāo)準(zhǔn)的、簡(jiǎn)易的開(kāi)發(fā)模式焰坪,使程序員不必過(guò)多的關(guān)心SQL——有人會(huì)對(duì)這一點(diǎn)提出異議嗎趣倾?使用簡(jiǎn)易并且標(biāo)準(zhǔn)化,這其實(shí)是每一個(gè)框架的設(shè)計(jì)初衷某饰。如果必須要大費(fèi)周折寫(xiě)出一段執(zhí)行簡(jiǎn)單功能的代碼誊酌,才能夠顯示出個(gè)人技術(shù)的高深莫測(cè),我們何不自己封裝JDBC露乏?
? ? ? ? 現(xiàn)在回到最初討論的話(huà)題上來(lái):我們要找出框架設(shè)計(jì)的原則碧浊,符合這一原則的我們就認(rèn)為是好的,否則無(wú)論這個(gè)框架的實(shí)現(xiàn)原理有多么復(fù)雜瘟仿,使用起來(lái)有多么困難箱锐,也不應(yīng)該認(rèn)為是一個(gè)良好的框架。
? ? ? ? java持久層操作最原始的是基于JDBC的操作劳较,它提供了java程序與數(shù)據(jù)庫(kù)的連接驹止。JDBC的操作步驟大致如下:
? ? ? ? 一、使用Class.forName("Driver Name")裝載驅(qū)動(dòng)观蜗。
? ? ? ? 二臊恋、使用Connection con = DriverManager.getConnection(url, "username", "password");指
????????????????定數(shù)據(jù)庫(kù)連接地址、用戶(hù)名和密碼建立一個(gè)連接對(duì)象墓捻。
? ? ? ? 三抖仅、使用Statement stmt = con.createStatement();創(chuàng)建一個(gè)statement對(duì)象用來(lái)執(zhí)行sql。
? ? ? ? 四砖第、ResultSet rs = stmt.executeQuery("SELECT column FROM table")撤卢;使用statement
????????????????獲取結(jié)果集,并最終封裝成java對(duì)象梧兼。
這些操作步驟固定放吩,而且需要編寫(xiě)大量業(yè)務(wù)無(wú)關(guān)的代碼,才能夠獲取到數(shù)據(jù)羽杰。而且sql與java代碼耦合在一起渡紫,每次要對(duì)返回?cái)?shù)據(jù)做單獨(dú)的復(fù)雜處理到推。這樣在以后程序擴(kuò)展起來(lái)會(huì)變得非常麻煩,hibernate和mybatis就是用來(lái)解決這些問(wèn)題的惕澎,但是在處理問(wèn)題的思想上二者有著不同莉测,hibernate意在對(duì)持久化操作進(jìn)行一個(gè)完整的封裝,程序員可以通過(guò)java語(yǔ)言就可以操作數(shù)據(jù)庫(kù)集灌,而不必關(guān)注sql的實(shí)現(xiàn)。而mybatis則保留了sql自定義的功能复哆,僅對(duì)JDBC一些通用的步驟進(jìn)行了封裝欣喧。二者在持久層實(shí)現(xiàn)上各有千秋,但我認(rèn)為mybatis的這一做法在現(xiàn)階段是很符合實(shí)際的一些需求的梯找。
? ? ? ? 首先唆阿,hibernate的封裝過(guò)于嚴(yán)重,開(kāi)發(fā)人員完全不知道sql的具體實(shí)現(xiàn)锈锤,因此無(wú)法對(duì)于sql進(jìn)行優(yōu)化驯鳖。當(dāng)然,這也是hibernate設(shè)計(jì)的初衷——開(kāi)發(fā)人員無(wú)須關(guān)注sql的實(shí)現(xiàn)久免。但是對(duì)于一些復(fù)雜的需求浅辙,需要關(guān)聯(lián)多張表并且進(jìn)行復(fù)雜查詢(xún)的,hibernate就顯得力不從心了阎姥,有時(shí)候我們又不得不自定義一些本地sql去實(shí)現(xiàn)功能记舆。也許有反對(duì)者會(huì)說(shuō):那是hibernate的學(xué)習(xí)成本較高,而我們對(duì)于hibernate的了解又不夠深呼巴。但是一個(gè)成熟的技術(shù)是無(wú)須開(kāi)發(fā)人員進(jìn)行揣測(cè)的泽腮,如果hibernate有一些可行的解決方案,大可以在官網(wǎng)上進(jìn)行聲明衣赶。再說(shuō)诊赊,哪一個(gè)使用hibernate的大牛,在項(xiàng)目中沒(méi)有使用過(guò)本地sql呢府瞄?而且碧磅,既然hibernate的使用成本如此高、使用起來(lái)又如此復(fù)雜遵馆,顯然違背了框架設(shè)計(jì)的初衷续崖。說(shuō)一樣技術(shù)因?yàn)槭褂脧?fù)雜,所以用起來(lái)才能夠簡(jiǎn)單高效团搞,簡(jiǎn)直是不可思議严望!
? ? ? ? 其次,有時(shí)候一些需求并非需要某張表所有的字段逻恐,比如在做用戶(hù)登錄認(rèn)證的時(shí)候像吻,我們僅需要用戶(hù)名密碼即足夠了峻黍。但由于hibernate的完全對(duì)象映射,我們不得已要查詢(xún)出所有的字段拨匆。這就好像要去一個(gè)商店買(mǎi)東西姆涩,本來(lái)僅僅需要買(mǎi)一瓶飲料就好了,但卻不得已搬來(lái)了整個(gè)商店惭每!在單表操作骨饿,或者表關(guān)聯(lián)不是很多的情況下,還能夠接受台腥。但如果關(guān)聯(lián)的表很多宏赘,且表中的字段也非常多呢?這樣肯定很大程度上會(huì)影響性能的黎侈。
? ? ? ? 當(dāng)然察署,在業(yè)務(wù)簡(jiǎn)單,項(xiàng)目比較小時(shí)峻汉,hibernate還是具有明顯的優(yōu)勢(shì)的贴汪。而且,hibernate遇到的所有這些問(wèn)題休吠,都不應(yīng)該去進(jìn)行掩飾的扳埂,而是值得我們進(jìn)行思考的。就像我們期望出現(xiàn)一種計(jì)算機(jī)語(yǔ)言瘤礁,它更加接近人類(lèi)的語(yǔ)言聂喇,我們無(wú)需做更多的事就可以完成復(fù)雜的功能。這種想法可以當(dāng)做一種理想蔚携,如果要實(shí)現(xiàn)它則需要付出更多的心血去完成希太。