版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、你對面向?qū)ο蟮睦斫??我的思路是:回答時從面向?qū)ο蟮娜筇卣骰卮稹0ㄈ齻€特征:繼承、封裝、多態(tài)。類的繼承性是指從已有的一個類來 extends子類,子類具有了父類的所有特征,同時,子類也可以 有新的特性。比如:人是一個類,男人具有了人類的所有的特性,比如思考,比如勞動。同時,男 人也有新的特性,比如男人會長胡子。類的封裝是指類把所有的操作都封閉起來,僅僅提供接口出來讓其他人使用,使用的人沒有必要懂 得類里面的操作,只需要懂得操作接口就可以了。比如開汽車,我們只需要懂得方向盤、剎車、油門等等的使用就可以了,沒有必要知道剎車是如何構(gòu)成的封閉好的操作。同時,封裝也提高了程序 的可替換性。比如兩個汽車
2、公司實現(xiàn)剎車的方式不一樣,但是,只要我們學(xué)會了使用剎車,那么,開兩個汽車公司的車就都沒有問題了,我們不需要考慮他們怎樣實現(xiàn)剎車這門技術(shù)的。類的多態(tài)性是一個對象的某項功能可以處理不同類型的問題,或者一個子類可以將父類的某個功能 替換成新的功能,具體到編程的方面來說實現(xiàn)類的多態(tài)有override和overload ,也就是重寫和重載同時面向?qū)ο筮€有一個很重要的概念:抽象。抽象就是一個事物的本質(zhì)。當(dāng)然對于本質(zhì),不同的角度卻會有不同的理解。男人,在和女人一起的時候,它的本質(zhì)是人。在和所有的生物一起的時候, 它的本質(zhì)是動物。(雖然哲學(xué)家都說事物的本質(zhì)只有一個,但是,我仍然堅持我的觀點)java中Stri
3、ng 類為什么要設(shè)計成final呢??不允許其他類繼承。這個應(yīng)該不是最終原因,但這里權(quán)且也當(dāng)成是一個原因。? String類中的成員屬性也幾乎 都設(shè)計成了 private final的,這樣String就被設(shè)計成一個不變類, 這樣有助于共享,提高性能??梢詫⒆址畬ο蟊4嬖谧址A砍刂幸怨┡c字面值相同字符串對象共享。如果String對象是可變的,那就不能這樣共享,因為一旦對某一個String類型變量引用的對象值改變,將同時改變一起共享字符串對象的其他String類型變量所引用的對象的值。? String被設(shè)計為不變類,其中的 offset , value口都被設(shè)計成private final
4、的,這樣在多線程時, 對String對象的訪問是可以保證安全的。java程序語言的許多特性依賴于不可變的String對象說說Hashpmap勺原理?HashMap既述HashMa前基于哈希表的 Map接口的非同步實現(xiàn)。此實現(xiàn)提供所有可選的映射操作,并允許使用 null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恒久不變。?HashMapB勺數(shù)據(jù)結(jié)構(gòu)在java編程語言中,最基本的結(jié)構(gòu)就是兩種,一個是數(shù)組,另外一個是模擬指針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個基本結(jié)構(gòu)來構(gòu)造的,HashMa獨不例外。HashMa像際上是一個“鏈表散列的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體。HashMap底
5、層就是一個數(shù)組結(jié)構(gòu),數(shù)組中的每一項又是一個鏈表。當(dāng)新建一個HashMa由勺時候,就會初始化一個數(shù)組。什么是AOP.概念介紹:所謂 AOP即Aspect orientiedprogram,就是面向方面的編程,.什么是方面:所謂“方面”,簡單地說,就是將那些與業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào) 用的邏輯或責(zé)任封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未 來的可操作性和可維護性。.Aop的原理:面向切面編程,將程序中的交叉業(yè)務(wù)邏輯(比如安全,日志,事務(wù)等),封裝成一個切面,然后注入到目標(biāo)對象(具體業(yè)務(wù)邏輯)中去。.實現(xiàn)AOP的技術(shù),主要分為兩大類:一是采用動態(tài)代理技術(shù),利用截取消息的
6、方式,對該消息進行裝飾,以取代原有對象行為的執(zhí)行; 二是采用靜態(tài)織入的方式,引入特定的語法創(chuàng)建方面”,從而使得編譯器可以在編譯期間織人有關(guān)方面”的代碼IOC控制反轉(zhuǎn)也叫依賴注入。利用了工廠模式將對象交給容器管理,你只需要在spring配置文件中配置相應(yīng)的bean,以及設(shè)置相關(guān)的屬性,讓 spring容器來生成類的實例對象以及管理對象。數(shù)據(jù)庫觸發(fā)器的優(yōu)缺點以及用法觸發(fā)器本質(zhì)上講就是事件監(jiān)控器,可以定義在數(shù)據(jù)庫系統(tǒng)進行某一個操作的前后。當(dāng)數(shù)據(jù)庫系統(tǒng)在進行特定的操作時,發(fā)現(xiàn)有觸發(fā)器定義,就去執(zhí)行觸發(fā)器定義的功能,從而滿足某些特定的需要。(觸發(fā)器就是你在做某個操作的時候觸發(fā)另外一個操作)例如,在更新某
7、些數(shù)據(jù)后,再去更新特定的數(shù)據(jù)。這就可以定義一個觸發(fā)器完成這樣的需要。觸發(fā)器的優(yōu)點:以事件方式來處理.當(dāng)數(shù)據(jù)發(fā)生變化的時候,自動作處理。缺點:當(dāng)數(shù)據(jù)庫之間 導(dǎo)出導(dǎo)入的時候,可能會引起不必要的觸發(fā)邏輯。oracle,mysql,SqlServer三種數(shù)據(jù)庫的分頁查詢的實例MySql:MySQ擻據(jù)庫實現(xiàn)分頁比較簡單,提供了LIMIT函數(shù)。一般只需要直接寫到 sql語句后面就行了。LIMIT子句可以用來限制由SELEC印句返回過來的數(shù)據(jù)數(shù)量,它有一個或兩個參數(shù),如果給出兩個參數(shù), 第一個參數(shù)指定返回的第一行在所有數(shù)據(jù)中的位置,從 0開始(注意不是1),第二個參數(shù)指定最多返 回行數(shù)。例如:select*
8、 fromtableWHERE-LIMIT10; #返回前10行select* fromtableWHERE-LIMIT0,10; #返回前10行select* fromtableWHERE-LIMIT10,20; 腿回第10-20行數(shù)據(jù)Oracle :考慮mySql中的實現(xiàn)分頁,select * from表名limit開始記錄數(shù),顯示多少條;就可以實現(xiàn)我們的分頁效果。但是在oracle中沒有l(wèi)imit 關(guān)鍵字,但是有 rownum字段rownum是一個偽列,是oracle系統(tǒng)自動為查詢返回結(jié)果的每行分配的編號,第一行為1,第二行為2,以此類推。第一種:代碼如下:SELECT* FROM(SE
9、LECTA.*, ROWNURNFROM(SELECT* FROMTABLE_NAMEAWHEREOWNUM= 40)WHEREN = 21其中最內(nèi)層的查詢SELECT* FROMTABLE_NAME示不進行翻頁的原始查詢語句。ROWNU=21控制分頁查詢的每頁的范圍。上面給出的這個分頁查詢語句,在大多數(shù)情況擁有較高的效率。分頁的目的就是控制輸出結(jié)果集大小,將結(jié)果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現(xiàn)在WHEREOWNUM= 40這句上。選擇第21到40條記錄存在兩種方法,一種是上面例子中展示的在查詢的第二層通過ROWNUM= 40來控制最大值,在查詢的最外層控制最小值。而另一種
10、方式是去掉查詢第二層的WHERROWNU祚40語句,在查詢的最外層控制分頁的最小值和最大值。第二種:代碼如下:select * from (select e.*,rownum r from (select * from emp order by saldesc) e) e1 where e1.r21 and e1.r(SELECTMAX(id)FROM(SELECTTOP20 idFROMTestTableORDERBYid) AST)ORDERBYIDSELECTTOP 頁大小 *FROMTestTableWHERE(ID(SELECTMAX(id)FROM(SELECTTOP 頁大小* 頁
11、數(shù) idFROM 表ORDERBYid) AST)ORDERBYID分頁方案三:(利用SQL的游標(biāo)存儲過程分頁) 代碼如下:create procedure XiaoZhengGe sqlstr nvarchar(4000),-查詢字符串currentpage int, 一第 N 頁 pagesize int 一每頁行數(shù) as set nocount ondeclare P1 int, -P1 是游標(biāo)的 idrowcount intexec sp_cursoropen P1 output,sqlstr,scro110Pt=1,ccopt=1,rowcount=rowcountoutputsel
12、ect ceiling(1.0*rowcount/pagesize) as 總頁數(shù)-,rowcount as 總行數(shù),currentpage as 當(dāng) 前頁set currentpage=(current1)*pagesize+1exec sp_cursorfetch P1,16,currentpage,pagesizeexec sp_cursorclose P1 set nocount off其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。建議優(yōu)化的時候,加上主鍵和索引,查詢效率會提高。通過SQL查詢分析器,顯示比較:結(jié)論是:分頁方案二:(利用ID大于多少和SELEC
13、TTO吩頁)效率最高,需要拼接 SQL語句分頁方案一:(利用Not In和SELECTTO吩頁)效率次之,需要拼接 SQL語句分頁方案三:(利用SQL的游標(biāo)存儲過程分頁)效率最差,但是最為通用 在實際情況中,要具體分析。靜態(tài)變量和實例變量的區(qū)別?在語法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字,而實例變量前則不加。在程序運行時的區(qū)別:實例變量屬于某個對象的屬性,必須創(chuàng)建了實例對象,其中的實例變量才會被分配 空間,才能使用這個實例變量。靜態(tài)變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象,靜態(tài)變量就會被分配空間,靜態(tài)變量就可以被使用了???
14、之,實例變量必須創(chuàng)建對象后才可以通過這個對象來使用,靜態(tài)變量則可以直接使用類名來引用。abstract class 和 interface 有什么區(qū)別?含有abstract修飾符的class即為抽象類,abstract類不能創(chuàng)建的實例對象。含有 abstract方法的類必 須定義為abstract class, abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法。如果的子類沒有實現(xiàn)抽象父類中 的所有抽象方法,那么子類也必須定義為abstract類型。接口(infas)可
15、以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法 定義默認為public abstract類型,接口中的成員變量類型默認為public static final 下面比較一下兩者的語法區(qū)別:.抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。.抽象類中可以有普通成員變量,接口中沒有普通成員變量.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方 法。.抽象類中的抽象方法的訪I可類型可以是public, protected 但接口中的抽象方法只能是public類型的,并且默認即為 public abstract類型。.抽象類中可以包含靜態(tài)方法,
16、接口中不能包含靜態(tài)方法.抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。. 一個類可以實現(xiàn)多個接口,但只能繼承一個抽象類。下面接著再說說兩者在應(yīng)用上的區(qū)別:接口更多的是在系統(tǒng)架構(gòu)設(shè)計方法發(fā)揮作用,主要用于定義模塊之間的通信契約。而抽象類在代碼實 現(xiàn)方面發(fā)揮作用,可以實現(xiàn)代碼的重用。abstract的method是否可同時是static, 是否可同時是native ,是否可同時是 synchronized?都不是。理由如下:abstract的
17、method不可以是static的,因為抽象的方法是要被子類實現(xiàn)的,而 static與子類扯不上關(guān)native方法表示該方法要用另外一種依賴平臺的編程語言實現(xiàn)的,不存在著被子類實現(xiàn)的問題,所以, 它也不能是抽象的,不能與 abstract混用。synchronized應(yīng)該是作用在一個具體的方法上才有意義。而且,方法上的synchr0mzed同步所使用的同步鎖對象是this ,而抽象方法上無法確定this是什么。Java中的異常處理機制的簡單原理和應(yīng)用。異常是指java程序運行時(非編譯)所發(fā)生的非正常情況或錯誤,與現(xiàn)實生活中的事件很相似,現(xiàn)實生活中的事件可以包含事件發(fā)生的時間、地點、人物、情節(jié)
18、等信息,可以用一個對象來表示,Java使用面向?qū)ο蟮姆绞絹硖幚懋惓#殉绦蛑邪l(fā)生的每個異常也都分別封裝到一個對象來表示的,該對象中包含有 異常的信息。Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為 java.lang.Throwable, Throwable下面又派生了兩個子類:Error和Exception, Error表不應(yīng)用程序本身無法Exception克服和恢復(fù)的一種嚴重問題,程序只有死的份了,例如,說內(nèi)存溢出和線程死鎖等系統(tǒng)問題。表示程序還能夠克服和恢復(fù)的問題,其中又分為系統(tǒng)異常和普通異常,系統(tǒng)異常是軟件本身缺陷所導(dǎo)致的 問題,也就是軟件開發(fā)人
19、員考慮不周所導(dǎo)致的問題,軟件使用者無法克服和恢復(fù)這種問題,但在這種問題 下還可以讓軟件系統(tǒng)繼續(xù)運行或者讓軟件死掉,例如,數(shù)組腳本越界( ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉(zhuǎn)換異常(ClassCastExceptio;普通異常是運行環(huán)境的變化或 異常所導(dǎo)致的問題,是用戶能夠克服的問題,例如,網(wǎng)絡(luò)斷線,硬盤空間不夠,發(fā)生這樣的異常后,程序 不應(yīng)該死掉java為系統(tǒng)異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try.catch處理或用throws聲明繼續(xù)拋給上層調(diào)用方法處理,所以普通異常也稱為che
20、cked異常,而系統(tǒng)異??梢蕴幚硪部梢圆惶幚恚?,編譯器不強制用try.catch處理或用throws聲明,所以系統(tǒng)異常也稱為 unchecked異常。當(dāng)一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?分幾種情況:.其他方法前是否加了 synchronized關(guān)鍵子,如果沒加,則能。.如果這個方法內(nèi)部調(diào)用了wait,則可以進入其他synchronized方法。.如果其他個方法都加了 ”.。論可關(guān)鍵字,并且內(nèi)部沒有調(diào)用wait,則不能。.如果其他方法是static,它用的同步鎖是當(dāng)前類的字節(jié)碼,與非靜態(tài)的方法不能同步,因為非靜態(tài) 的方法用的是thi
21、s。List 和 Map 區(qū)別?List是存儲單列數(shù)據(jù)的集合,Map是存儲鍵和值這樣的雙列數(shù)據(jù)的集合,List中存儲的數(shù)據(jù)是有順序,并且允許重復(fù);Map中存儲的數(shù)據(jù)是沒有順序的,其鍵是不能重復(fù)的,它的值是可以有重復(fù)的。List、Map Set三個接口,存取元素時,各有什么特點?首先,List與Set具有相似性,它們都是單列元素的集合,所以,它們有一個功共同的父接口,叫 Collection Set里面不允許有重復(fù)的元素,所謂重復(fù),即不能有兩個相等(注意,不是僅僅是相同)的對 象。Set取元素時,沒法說取第幾個,只能以 Iterat0r接口取得所有的元素,再逐一遍歷各個元素。List表示有先后順
22、序的集合,注意,不是那種按年齡、按大小、按價格之類的排序。當(dāng)我們多次調(diào)用add(Obje)方法時,每次加入的對象就像火車站買票有排隊順序一樣,按先來后到的順序排序。有時候, 也可以插隊,即調(diào)用add(int index,Obje)方法,就可以指定當(dāng)前對象在集合中的存放位置。一個對象可以被反復(fù)存儲進List中,每調(diào)用一次add方法,這個對象就被插入進集合中一次,其實,并不是把這個對象 本身存儲進了集合中,而是在集合中用一個索引變量指向這個對象,當(dāng)這個對象被add多次時,即相當(dāng)于集合中有多個索引指向了這個對象,如圖x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍歷各個元素之外
23、,還可以調(diào)用get0ndex0來明確說明取第幾個。Map與List和Set不同,它是雙列的集合,其中有put方法,定義如下:put(obj key,obj value),每次 存儲時,要存儲一對key/value,不能存儲重復(fù)的key,這個重復(fù)的規(guī)則也是按 equals比較相等。取則可以 根據(jù)key獲得相應(yīng)的value,即get(Object key浮回彳置為key所對應(yīng)的value0另外,也可以獲得所有的key 的結(jié)合,還可以獲得所有的value的結(jié)合,還可以獲得key和value組合成的Map.Entry對象的集合。List以特定次序來持有元素,可有重復(fù)元素。Set無法擁有重復(fù)元素,內(nèi)部排
24、序。Map保存key-value值,value可多值。說出一些常用的類,包,接口,請各舉5個要讓人家感覺你對javaee開發(fā)很熟,所以,不能僅僅只列corejava中的那些東西,要多列你在做 $金項目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integerjava.util.Date,System,Class List,HashMap常用的包:java.lang java.io java.util java.sql ,javax.servlet,org.
25、apache.strtuts.action,org.hibernate常用的接口: Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、 Session(Hibernate),HttpSessionJS可口 Servlet有哪些相同點和不同點,他們之間的聯(lián)系是什么?JSP是Servlet技術(shù)的擴展,本質(zhì)上是 Servlet的簡易方式,更強調(diào)應(yīng)用的外表表達。JSP編譯后是“類servlet Servlet和JsPR主要的不同點在于,Serv
26、let的應(yīng)用邏輯是在Java文件中,并且完全從表小層中 的HTML里分離開來。而JSP的情況是1村2和HTML可以組合成一個擴展名為.jsp的文件。jsP則重于視圖, Servlet主要用于控制邏輯。你們的項目總金額多少,多少人開發(fā),總共花了多少個月?像巴巴運動網(wǎng)這種規(guī)模的項目,可以說是4、5個人、開發(fā)了 4、5個月,費用則是4、50萬。按每人每月兩萬收入去計算,就差不多了。你們公司使用的代碼配置管理工具是什么?除了說以前使用cvs,現(xiàn)在新項目使用svn 了,還簡要說一下使用的過程,如果有可能,還說說倉庫 的概念和如何使用鎖之類的細節(jié)。Struts2的工作流程1、客戶端瀏覽器發(fā)出 http請求
27、。2、根據(jù) web.xml配置,該請求被 FilterDispatcher接收。3、根據(jù)struts.xml配置,找到需要調(diào)用的 Action類和方法, 并通過10c方式,將值注入給 Aciton4、Action調(diào)用業(yè)務(wù)邏輯組件處理業(yè)務(wù)邏輯,這一步包含表單驗證。5、Action執(zhí)行完畢,根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果result,并跳轉(zhuǎn)到相應(yīng)頁面。6、返回http響應(yīng)到客戶端瀏覽器。SpringMVCW Struts2 的比較:機制:spring mvc的入口是servlet ,而struts2 是filter ,這樣就導(dǎo)致了二者的機制不同,這里就牽涉 到servlet 和
28、filter 的區(qū)別了。性能:spring 會稍微比struts快。spring mvc是基于方法的設(shè)計,而 sturts是基于類,每次發(fā)一次請求 都會實例一個action ,每個action都會被注入屬性,而spring基于方法,粒度更細,但要小心把握像在servlet控制數(shù)據(jù)一樣。spring3 mvc是方法級別的攔截,攔截到方法后根據(jù)參數(shù)上的注解,把 request數(shù)據(jù)注入進去,在 spring3 mvc中,一個方法對應(yīng)一個 request上下文。而struts2 框架是類級 別的攔截,每次來了請求就創(chuàng)建一個Action ,然后調(diào)用setter getter方法把request中的數(shù)據(jù)注
29、入;struts2 實際上是通過 setter getter 方法與request打交道的;struts2 中,一個 Action 對象對應(yīng)一個 request 上下文。參數(shù)傳遞:struts是在接受參數(shù)的時候,可以用屬性來接受參數(shù),這就說明參數(shù)是讓多個方法共享的。設(shè)計思想上:struts更加符合oop的編程思想,spring就比較謹慎,在servlet上擴展。intercepter 的實現(xiàn)機制:有 以自己的interceptor 機制,spring mvc用的是獨立的 AOP式。這樣導(dǎo)致struts的配置文件 量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得論使用上來
30、講,spring mvc使用更加簡潔,開發(fā)效率Spring MVC!實比struts2高。spring mvc是方法級別的攔截,一個方法對應(yīng)一個 request上下文,而方法同時又跟一個url對應(yīng),所以說從架構(gòu)本身上 spring3 mvc就容易實現(xiàn)restfulurl。struts2 是類級別的攔截,一個類對應(yīng)一個request上下文;實現(xiàn)restful url要費勁,因為struts2 action的一個方法可以對應(yīng)一個 url ;而其類屬性卻被所有方法共享,這也就無法用注解或其他 方式標(biāo)識其所屬方法了。spring3mvc的方法之間 基本上獨立的,獨享request response數(shù)據(jù)
31、,請求數(shù)據(jù)通過參數(shù)獲取,處理結(jié)果通過ModelMap交回給框架方法之間不共享變量,而 struts2 搞的就比較亂, 雖然方法之間 也是獨立的,但其所有 Action變量是共享的,這不會影響程序運行,卻給我們編碼,讀程 序時帶來麻煩??偨Y(jié):Strutl目前已經(jīng)很少再用,個人感覺 springMVC在易用性上要優(yōu)于 struts2.struts2 和springMVC 在性能方面是不分伯仲,每個陣營都有自己的測試數(shù)據(jù),很難說哪一個更優(yōu)秀。以上資料部分摘自網(wǎng)絡(luò), 尊重原作者版權(quán),分享給更多的讀者。Hibernate 與 MyBatis 的比較第一章 Hibernate 與 MyBatisHiber
32、nate是當(dāng)前最流行的 O/R mapping框架,它出身于 ,現(xiàn)在已經(jīng)成為 Jboss的一部分。 Mybatis是另外一種優(yōu)秀的 O/R mapping框架。目前屬于 apache的一個子項目。Hibernate 簡介Hibernate對數(shù)據(jù)庫結(jié)構(gòu)提供了較為完整的封裝,Hibernate的O/R Mapping實現(xiàn)了 POJ的數(shù)據(jù)庫表之間的映射,以及 SQL的自動生成和執(zhí)行。程序員往往只需定義好了POJC數(shù)據(jù)庫表的映射關(guān)系,即可通過Hibernate提供的方法完成持久層操作。程序員甚至不需要對SQL的熟練掌握,Hibernate/OJB會根據(jù)制定的存儲邏輯,自動生成對應(yīng)的SQL并調(diào)用JDB%
33、口加以執(zhí)行。MyBatis 簡介iBATIS的著力點,則在于POJO1 $、之間的映射關(guān)系。然后通過映射配置文件,將SQL所需的參數(shù),以及返回的結(jié)果字段映射到指定POJO相對Hibernate “O/R而言,舊ATIS是一種“ Sql Mapping”的OR睢現(xiàn)。第二章開發(fā)對比開發(fā)速度Hibernate的真正掌握要比 Mybatis來得難些。Mybatis框架相對簡單很容易上手,但也相對簡陋些。 個人覺得要用好 Mybatis還是首先要先理解好 Hibernate。開發(fā)社區(qū)Hibernate與Mybatis都是流行的持久層開發(fā)框架,但 Hibernate開發(fā)社區(qū)相對多熱鬧些,支持的工 具也多,
34、更新也快,當(dāng)前最高版本 4.1.8 o而Mybatis相對平靜,工具較少,當(dāng)前最高版本3.2。開發(fā)工作量Hibernate和MyBatis都有相應(yīng)的代碼生成工具??梢陨珊唵位镜腄AO層方法。針對高級查詢,Mybatis需要手動編寫SQ曲句,以及 ResultMap。而Hibernate有良好的映射機制, 開發(fā)者無需關(guān)心SQL的生成與結(jié)果映射,可以更專注于業(yè)務(wù)流程。第三章系統(tǒng)調(diào)優(yōu)對比Hibernate的調(diào)優(yōu)方案制定合理的緩存策略;盡量使用延遲加載特性;采用合理的Session管理機制;使用批量抓取,設(shè)定合理的批處理參數(shù)( batch_size );進行合理的O/R映射設(shè)計Mybatis調(diào)優(yōu)方
35、案MyBatis在Session方面和Hibernate的Session生命周期是一致的,同樣需要合理的Session管理機制。MyBatis同樣具有二級緩存機制。MyBatis可以進行詳細的SQ優(yōu)化設(shè)計。SQK化方面Hibernate的查詢會將表中的所有字段查詢出來,這一點會有性能消耗。Hibernate也可以自己寫SQL來指定需要查詢的字段,但這樣就破壞了Hibernate開發(fā)的簡潔性。而 Mybatis的SQL是手動編寫的,所以可以按需求指定查詢的字段。Hibernate HQL語句的調(diào)優(yōu)需要將SQL打印出來,而Hibernate的SQL被很多人嫌棄因為太丑了。MyBatis的SQL是自
36、己手動寫的所以調(diào)整方便。但 Hibernate具有自己的日志統(tǒng)計。Mybatis本身不帶日志統(tǒng)計,使用Log4j進行日志記錄。擴展性方面Hibernate與具體數(shù)據(jù)庫的關(guān)聯(lián)只需在 XMLt件中配置即可,所有的HQ曲句與具體使用的數(shù)據(jù)庫無關(guān),移植性很好。MyBatis項目中所有的SQL語句都是依賴所用的數(shù)據(jù)庫的,所以不同數(shù)據(jù)庫類型的支持 不好。第四章對象管理與抓取策略對象管理Hibernate是完整的對象/關(guān)系映射解決方案,它提供了對象狀態(tài)管理( state management的功能, 使開發(fā)者不再需要理會底層數(shù)據(jù)庫系統(tǒng)的細節(jié)。也就是說,相對于常見的JDBC/SQL持久層方案中需要管理SQL語
37、句,Hibernate采用了更自然的面向?qū)ο蟮囊暯莵沓志没疛ava應(yīng)用中的數(shù)據(jù)。換句話說,使用 Hibernate的開發(fā)者應(yīng)該總是關(guān)注對象的狀態(tài)(state ),不必考慮SQL語句的執(zhí) 行。這部分細節(jié)已經(jīng)由Hibernate掌管妥當(dāng),只有開發(fā)者在進行系統(tǒng)性能調(diào)優(yōu)的時候才需要進行了解。而MyBatis在這一塊沒有文檔說明,用戶需要對對象自己進行詳細的管理抓取策略Hibernate對實體關(guān)聯(lián)對象的抓取有著良好的機制。對于每一個關(guān)聯(lián)關(guān)系都可以詳細地設(shè)置是否延遲加載,并且提供關(guān)聯(lián)抓取、查詢抓取、子查詢抓取、批量抓取四種模式。它是詳細配置和處理的。而Mybatis的延遲加載是全局配置的。第五章緩存機制對
38、比Hibernate 緩存Hibernate 一級緩存是Session緩存,利用好一級緩存就需要對Session的生命周期進行管理好。建議在一個Action操作中使用一個Session。一級緩存需要對 Session進行嚴格管理。Hibernate二級緩存是SessionFactory 級的緩存。SessionFactory 的緩存分為內(nèi)置緩存和外置緩存。內(nèi)置緩存中存放的是SessionFactory對象的一些集合屬性包含的數(shù)據(jù)(映射元素據(jù)及預(yù)定SQL語句等),對于應(yīng)用程序來說,它是只讀的。外置緩存中存放的是數(shù)據(jù)庫數(shù)據(jù)的副本,其作用和一級緩存類似.二級緩存除了以內(nèi)存作為存儲介質(zhì)外,還可以選用硬
39、盤等外部存儲設(shè)備。二級緩存稱為進程級緩存或SessionFactory 級緩存,它可以被所有 session共享,它的生命周期伴隨著SessionFactory的生命周期存在和消亡。MyBatis 緩存MyBatis包含一個非常強大的查詢緩存特性,它可以非常方便地配置和定制。MyBatis 3中的緩存實現(xiàn)的很多改進都已經(jīng)實現(xiàn)了,使得它更加強大而且易于配置。默認情況下是沒有開啟緩存的,除了局部的session緩存,可以增強變現(xiàn)而且處理循環(huán)依賴也是必須的。要開啟二級緩存,你需要在你的SQLM射文件中添加一行:字面上看就是這樣。這個簡單語句的效果如下:映射語句文件中的所有select語句將會被緩存。
40、映射語句文件中的所有insert,update 和delete語句會刷新緩存。緩存會使用 Least Recently Used(LRU,最近最少使用的)算法來收回。根據(jù)時間表(比如no Flush Interval,沒有刷新間隔),緩存不會以任何時間順序來刷新。緩存會存儲列表集合或?qū)ο螅o論查詢方法返回什么)的1024個引用。緩存會被視為是read/write(可讀/可寫)的緩存,意味著對象檢索不是共享的,而 且可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。所有的這些屬性都可以通過緩存元素的屬性來修改。比如:這個更高級的配置創(chuàng)建了一個 FIFO緩存,并每隔60秒刷新,存數(shù)結(jié)
41、果對象或列表的 512個引用,而且返 回的對象被認為是只讀的,因此在不同線程中的調(diào)用者之間修改它們會導(dǎo)致沖突??捎玫氖栈夭呗杂校J的是LRU:LRU最近最少使用的:移除最長時間不被使用的對象。FIFO先進先出:按對象進入緩存的順序來移除它們。SOFT 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象。WEAK 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象。flushInterval(刷新間隔)可以被設(shè)置為任意的正整數(shù),而且它們代表一個合理的毫秒形式的時間段。默認情況是不設(shè)置,也就是沒有刷新間隔,緩存僅僅調(diào)用語句時刷新。size(引用數(shù)目)可以被設(shè)置為任意正整數(shù),要記住你緩存的對象
42、數(shù)目和你運行環(huán)境的可用內(nèi)存資源數(shù)目。默認值是1024。readOnly(只讀)屬性可以被設(shè)置為true或false。只讀的緩存會給所有調(diào)用者返回緩存對象的相同實例。因此這些對象不能被修改。這提供了很重要的性能優(yōu)勢??勺x寫的緩存會返回緩存對象的拷貝(通過序列化)。這會慢一些,但是安全,因此默認是false 。相同點Hibernate和Mybatis的二級緩存除了采用系統(tǒng)默認的緩存機制外,都可以通過實現(xiàn)你自己的緩存或 為其他第三方緩存方案,創(chuàng)建適配器來完全覆蓋緩存行為。不同點Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,然后再在具體的表-對象映射中配置
43、是那種緩存。MyBatis的二級緩存配置都是在每個具體的表-對象映射中進行詳細配置,這樣針對不同的表可以自定義不同的緩存機制。并且 Mybatis可以在命名空間中共享相同的緩存配置和實例,通過 Cache-ref來實 現(xiàn)。兩者比較因為Hibernate對查詢對象有著良好的管理機制,用戶無需關(guān)心 SQL所以在使用二級緩存時如果出 現(xiàn)臟數(shù)據(jù),系統(tǒng)會報出錯誤并提示。而MyBatis在這一方面,使用二級緩存時需要特別小心。如果不能完全確定數(shù)據(jù)更新操作的波及范圍, 避免Cache的盲目使用。否則,臟數(shù)據(jù)的出現(xiàn)會給系統(tǒng)的正常運行帶來很大的隱患。第六章Hibernate與Mybatis對比總結(jié)兩者相同點?
44、Hibernate 與 MyBatis 都可以是通過 SessionFactoryBuider 由 XML配置文件生成 SessionFactory , 然后由SessionFactory 生成Session ,最后由Session來開啟執(zhí)行事務(wù)和 SQL語句。其中 SessionFactoryBuider , SessionFactory , Session 的生命周期都是差不多的。? Hibernate 和 MyBatis 都支持 JDBC JTA事務(wù)處理。Mybatis 優(yōu)勢? MyBatis可以進行更為細致的 SQL優(yōu)化,可以減少查詢字段。? MyBatis容易掌握,而Hibernate 門檻較高。 Hibernate 優(yōu)勢Hibernate的DAO1開發(fā)比MyBatis簡單,Mybatis需要維護SQL和結(jié)果映射。Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。Hibernate數(shù)據(jù)庫移植性很好,MyBatis的數(shù)據(jù)庫移植性不好,不同的數(shù)據(jù)庫需要寫不同SQLHibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。他人總結(jié)Hibernate功能強大,數(shù)據(jù)庫
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 熱敏電阻器制造工崗后測試考核試卷含答案
- 交換機務(wù)員安全實踐水平考核試卷含答案
- 煉鋼原料加工工標(biāo)準化強化考核試卷含答案
- 煤制油生產(chǎn)工QC管理能力考核試卷含答案
- 棉膠液制備工安全專項評優(yōu)考核試卷含答案
- 燃料值班員安全規(guī)程模擬考核試卷含答案
- 水生植物栽培工沖突管理強化考核試卷含答案
- 脂肪醇胺化操作工安全文明模擬考核試卷含答案
- 抽紗刺繡工崗后考核試卷含答案
- 2024年舟山市特崗教師招聘真題匯編附答案
- 廣東省深圳市龍華區(qū)2024-2025學(xué)年七年級上學(xué)期期末歷史試題(含答案)
- 74粉色花卉背景的“呵護女性心理健康遇見更美的自己”婦女節(jié)女性健康講座模板
- 2026長治日報社工作人員招聘勞務(wù)派遣人員5人備考題庫新版
- 煤礦兼職教師培訓(xùn)課件
- 2025至2030中國組網(wǎng)專線行業(yè)調(diào)研及市場前景預(yù)測評估報告
- 2025年南京科技職業(yè)學(xué)院單招職業(yè)適應(yīng)性考試模擬測試卷附答案
- 湖北省武漢市東湖新技術(shù)開發(fā)區(qū) 2024-2025學(xué)年七年級上學(xué)期期末道德與法治試卷
- 擋土墻施工安全培訓(xùn)課件
- 慢性腎臟?。–KD)患者隨訪管理方案
- 采購主管年終工作總結(jié)
- 成人學(xué)歷提升項目培訓(xùn)
評論
0/150
提交評論