1.collection
一.分兩部分:
一部分是一個(gè)一個(gè)存(稱(chēng)collection)。
另一部分是一對(duì)一對(duì)存(稱(chēng)Map)。
集合主要有3種重要的類(lèi)型:(集合只能存引用類(lèi)型)
List :是一個(gè)有序集合,可以放重復(fù)的數(shù)據(jù)。
Set:是一個(gè)無(wú)序集合,不允許放重復(fù)的數(shù)據(jù)
Map:是一個(gè)無(wú)序集合,集合中包含一個(gè)鍵對(duì)象,一個(gè)值對(duì)象,鍵對(duì)象不允許重復(fù)。值可以重復(fù)
(1)ArrayList和Vector的區(qū)別?
這兩個(gè)類(lèi)都實(shí)現(xiàn)了List接口(List接口繼承了Collection接口),他們都是有序集合,即存儲(chǔ)在這兩個(gè)集合中的元素的位置都是有順序的,相當(dāng)于一種動(dòng)態(tài)的數(shù)組,我們以后可以按位置索引號(hào)取出某個(gè)元素,,并且其中的數(shù)據(jù)是允許重復(fù)的,這是HashSet之類(lèi)的集合的最大不同處。
1)同步性:Vector是線程安全的,也就是說(shuō)是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個(gè)線程會(huì)訪問(wèn)到集合,那最好是使用ArrayList,因?yàn)樗豢紤]線程安全,效率會(huì)高些;如果有多個(gè)線程會(huì)訪問(wèn)到集合,那最好是使用Vector,因?yàn)椴恍枰覀冏约涸偃タ紤]和編寫(xiě)線程安全的代碼。
2)數(shù)據(jù)增長(zhǎng):ArrayList與Vector都有一個(gè)初始的容量大小,當(dāng)存儲(chǔ)進(jìn)它們里面的元素的個(gè)數(shù)超過(guò)了容量時(shí),就需要增加ArrayList與Vector的存儲(chǔ)空間,每次要增加存儲(chǔ)空間時(shí),不是只增加一個(gè)存儲(chǔ)單元,而是增加多個(gè)存儲(chǔ)單元,每次增加的存儲(chǔ)單元的個(gè)數(shù)在內(nèi)存空間利用與程序效率之間要取得一定的平衡。Vector默認(rèn)增長(zhǎng)為原來(lái)兩倍,而ArrayList的增長(zhǎng)策略在文檔中沒(méi)有明確規(guī)定(從源代碼看到的是增長(zhǎng)為原來(lái)的1.5倍)。ArrayList與Vector都可以設(shè)置初始的空間大小,Vector還可以設(shè)置增長(zhǎng)的空間大小,而ArrayList沒(méi)有提供設(shè)置增長(zhǎng)空間的方法。
總結(jié):即Vector增長(zhǎng)原來(lái)的一倍,ArrayList增加原來(lái)的0.5倍。
(2)HashMap和Hashtable的區(qū)別
HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,在只有一個(gè)線程訪問(wèn)的情況下,效率要高于Hashtable。
一.歷史原因:Hashtable是基于陳舊的Dictionary類(lèi)的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)
二.同步性:Hashtable是線程安全的,也就是說(shuō)是同步的,而HashMap是線程序不安全的,不是同步的
?三.值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value
2.棧和堆
heap和stack有什么區(qū)別。
java的內(nèi)存分為兩類(lèi),一類(lèi)是棧內(nèi)存,一類(lèi)是堆內(nèi)存。棧內(nèi)存是指程序進(jìn)入一個(gè)方法時(shí),會(huì)為這個(gè)方法單獨(dú)分配一塊私屬存儲(chǔ)空間,用于存儲(chǔ)這個(gè)方法內(nèi)部的局部變量,當(dāng)這個(gè)方法結(jié)束時(shí),分配給這個(gè)方法的棧會(huì)釋放,這個(gè)棧中的變量也將隨之釋放。
堆是與棧作用不同的內(nèi)存,一般用于存放不放在當(dāng)前方法棧中的那些數(shù)據(jù),例如,使用new創(chuàng)建的對(duì)象都放在堆里,所以,它不會(huì)隨方法的結(jié)束而消失。方法中的局部變量使用final修飾后,放在堆中,而不是棧中。
(3)JSP
jsp有哪些內(nèi)置對(duì)象?作用分別是什么? 分別有什么方法?
JSP共有以下9個(gè)內(nèi)置的對(duì)象:
request 用戶(hù)端請(qǐng)求,此請(qǐng)求會(huì)包含來(lái)自GET/POST請(qǐng)求的參數(shù)
response 網(wǎng)頁(yè)傳回用戶(hù)端的回應(yīng)
pageContext 網(wǎng)頁(yè)的屬性是在這里管理
session 與請(qǐng)求有關(guān)的會(huì)話期
application servlet 正在執(zhí)行的內(nèi)容
out 用來(lái)傳送回應(yīng)的輸出
config servlet的構(gòu)架部件
page JSP網(wǎng)頁(yè)本身
exception 針對(duì)錯(cuò)誤網(wǎng)頁(yè),未捕捉的例外
request表示HttpServletRequest對(duì)象。它包含了有關(guān)瀏覽器請(qǐng)求的信息,并且提供了幾個(gè)用于獲取cookie, header, 和session數(shù)據(jù)的有用的方法。
response表示HttpServletResponse對(duì)象,并提供了幾個(gè)用于設(shè)置送回 瀏覽器的響應(yīng)的方法(如cookies,頭信息等)
out對(duì)象是javax.jsp.JspWriter的一個(gè)實(shí)例,并提供了幾個(gè)方法使你能用于向?yàn)g覽器回送輸出結(jié)果。
pageContext表示一個(gè)javax.servlet.jsp.PageContext對(duì)象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對(duì)象的API,并且包裝了通用的servlet相關(guān)功能的方法。
session表示一個(gè)請(qǐng)求的javax.servlet.http.HttpSession對(duì)象。Session可以存貯用戶(hù)的狀態(tài)信息
applicaton 表示一個(gè)javax.servle.ServletContext對(duì)象。這有助于查找有關(guān)servlet引擎和servlet環(huán)境的信息
config表示一個(gè)javax.servlet.ServletConfig對(duì)象。該對(duì)象用于存取servlet實(shí)例的初始化參數(shù)。
page表示從該頁(yè)面產(chǎn)生的一個(gè)servlet實(shí)例
jsp有哪些動(dòng)作?作用分別是什么?
答:JSP共有以下6種基本動(dòng)作
jsp:include:在頁(yè)面被請(qǐng)求的時(shí)候引入一個(gè)文件。
jsp:useBean:尋找或者實(shí)例化一個(gè)JavaBean。
jsp:setProperty:設(shè)置JavaBean的屬性。
jsp:getProperty:輸出某個(gè)JavaBean的屬性。
jsp:forward:把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁(yè)面。
jsp:plugin:根據(jù)瀏覽器類(lèi)型為Java插件生成OBJECT或EMBED標(biāo)記
JSP中動(dòng)態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?
它總是會(huì)檢查所含文件中的變化,適合用于包含動(dòng)態(tài)頁(yè)面,并且可以帶參數(shù) 靜態(tài)INCLUDE用include偽碼實(shí)現(xiàn),定不會(huì)檢查所含文件的變化,適用于包含靜態(tài)頁(yè)面 <%@ include file=included.htm %>
兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別?
(下面的回答嚴(yán)重錯(cuò)誤,應(yīng)該是想問(wèn)forward和sendRedirect 的區(qū)別,畢竟出題的人不是專(zhuān)業(yè)搞文字藝術(shù)的人,可能表達(dá)能力并不見(jiàn)得很強(qiáng),用詞不一定精準(zhǔn),加之其自身的技術(shù)面也可能存在一些問(wèn)題,不一定真正將他的意思表達(dá)清楚了,嚴(yán)格意思上來(lái)講,一些題目可能根本就無(wú)人能答,所以,答題時(shí)要掌握主動(dòng),只要把自己知道的表達(dá)清楚就夠了,而不要去推敲原始題目的具體含義是什么,不要一味想著是在答題)答:有兩種,分別為:前者頁(yè)面不會(huì)轉(zhuǎn)向include所指的頁(yè)面,只是顯示該頁(yè)的結(jié)果,主頁(yè)面還是原來(lái)的頁(yè)面。執(zhí)行完后還會(huì)回來(lái),相當(dāng)于函數(shù)調(diào)用。并且可以帶參數(shù).后者完全轉(zhuǎn)向新頁(yè)面,不會(huì)再回來(lái)。相當(dāng)于go to 語(yǔ)句。
JSP和Servlet有哪些相同點(diǎn)和不同點(diǎn),他們之間的聯(lián)系是什么?
JSP是Servlet技術(shù)的擴(kuò)展,本質(zhì)上是Servlet的簡(jiǎn)易方式,更強(qiáng)調(diào)應(yīng)用的外表表達(dá)。JSP編譯后是"類(lèi)servlet"。Servlet和JSP最主要的不同點(diǎn)在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開(kāi)來(lái)。而JSP的情況是Java和HTML可以組合成一個(gè)擴(kuò)展名為.jsp的文件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯。
forward 和redirect的區(qū)別
(4)Struts2
談?wù)勀銓?duì)Struts2的理解
服務(wù)器啟動(dòng):Tomcat啟動(dòng)-? 加載自身web.xml---?加載所有項(xiàng)目的web.xml通過(guò)在項(xiàng)目的web.xml中引入過(guò)濾器,
-?Struts的核心功能的初始化,通過(guò)過(guò)濾器完成
1. 加載項(xiàng)目web.xml
2. 創(chuàng)建Struts核心過(guò)濾器對(duì)象, 執(zhí)行filter ?? init()
struts-default.xml,? ? 核心功能的初始化
struts-plugin.xml,? ? struts相關(guān)插件
struts.xml ? 用戶(hù)編寫(xiě)的配置文件
訪問(wèn):
3. 用戶(hù)訪問(wèn)Action, 服務(wù)器根據(jù)訪問(wèn)路徑名稱(chēng),找對(duì)應(yīng)的aciton配置, 創(chuàng)建action對(duì)象
4. 執(zhí)行默認(rèn)攔截器棧中定義的18個(gè)攔截器
5. 執(zhí)行action的業(yè)務(wù)處理方法
說(shuō)說(shuō)struts1與struts2的區(qū)別
Struts1最早的一種基于mvc模式的框架;
Struts2 是在Struts1的基礎(chǔ)上,融合了xwork的功能;
也可以說(shuō),Struts2 = struts1? +? xwork
(5)Hibernate
1)hibernate中的update()和saveOrUpdate()的區(qū)別,session的load()和get()的區(qū)別。
2)iBatis與Hibernate有什么不同?
3)介紹一下Hibernate的二級(jí)緩存?
2)iBatis與Hibernate有什么不同?
相同點(diǎn):屏蔽jdbc api的底層訪問(wèn)細(xì)節(jié),使用我們不用與jdbc api打交道,就可以訪問(wèn)數(shù)據(jù)。
jdbc api編程流程固定,還將sql語(yǔ)句與java代碼混雜在了一起,經(jīng)常需要拼湊sql語(yǔ)句,細(xì)節(jié)很繁瑣。
ibatis的好處:屏蔽jdbc api的底層訪問(wèn)細(xì)節(jié);將sql語(yǔ)句與java代碼進(jìn)行分離;提供了將結(jié)果集自動(dòng)封裝稱(chēng)為實(shí)體對(duì)象和對(duì)象的集合的功能,queryForList返回對(duì)象集合,用queryForObject返回單個(gè)對(duì)象;提供了自動(dòng)將實(shí)體對(duì)象的屬性傳遞給sql語(yǔ)句的參數(shù)。
Hibernate是一個(gè)全自動(dòng)的orm映射工具,它可以自動(dòng)生成sql語(yǔ)句,ibatis需要我們自己在xml配置文件中寫(xiě)sql語(yǔ)句,hibernate要比ibatis功能負(fù)責(zé)和強(qiáng)大很多。因?yàn)閔ibernate自動(dòng)生成sql語(yǔ)句,我們無(wú)法控制該語(yǔ)句,我們就無(wú)法去寫(xiě)特定的高效率的sql。對(duì)于一些不太復(fù)雜的sql查詢(xún),hibernate可以很好幫我們完成,但是,對(duì)于特別復(fù)雜的查詢(xún),hibernate就很難適應(yīng)了,這時(shí)候用ibatis就是不錯(cuò)的選擇,因?yàn)閕batis還是由我們自己寫(xiě)sql語(yǔ)句。
介紹一下Hibernate的二級(jí)緩存?
按照以下思路來(lái)回答:(1)首先說(shuō)清楚什么是緩存,(2)再說(shuō)有了hibernate的Session就是一級(jí)緩存,即有了一級(jí)緩存,為什么還要有二級(jí)緩存,(3)最后再說(shuō)如何配置Hibernate的二級(jí)緩存。
(1)緩存就是把以前從數(shù)據(jù)庫(kù)中查詢(xún)出來(lái)和使用過(guò)的對(duì)象保存在內(nèi)存中(一個(gè)數(shù)據(jù)結(jié)構(gòu)中),這個(gè)數(shù)據(jù)結(jié)構(gòu)通常是或類(lèi)似Hashmap,當(dāng)以后要使用某個(gè)對(duì)象時(shí),先查詢(xún)緩存中是否有這個(gè)對(duì)象,如果有則使用緩存中的對(duì)象,如果沒(méi)有則去查詢(xún)數(shù)據(jù)庫(kù),并將查詢(xún)出來(lái)的對(duì)象保存在緩存中,以便下次使用
Hibernate的Session就是一種緩存,我們通常將之稱(chēng)為Hibernate的一級(jí)緩存,當(dāng)想使用session從數(shù)據(jù)庫(kù)中查詢(xún)出一個(gè)對(duì)象時(shí),Session也是先從自己內(nèi)部查看是否存在這個(gè)對(duì)象,存在則直接返回,不存在才去訪問(wèn)數(shù)據(jù)庫(kù),并將查詢(xún)的結(jié)果保存在自己內(nèi)部。由于Session代表一次會(huì)話過(guò)程,一個(gè)Session與一個(gè)數(shù)據(jù)庫(kù)連接相關(guān)連,所以Session最好不要長(zhǎng)時(shí)間保持打開(kāi),通常僅用于一個(gè)事務(wù)當(dāng)中,在事務(wù)結(jié)束時(shí)就應(yīng)關(guān)閉。并且Session是線程不安全的,被多個(gè)線程共享時(shí)容易出現(xiàn)問(wèn)題。通常只有那種全局意義上的緩存才是真正的緩存應(yīng)用,才有較大的緩存價(jià)值,因此,Hibernate的Session這一級(jí)緩存的緩存作用并不明顯,應(yīng)用價(jià)值不大。Hibernate的二級(jí)緩存就是要為Hibernate配置一種全局緩存,讓多個(gè)線程和多個(gè)事務(wù)都可以共享這個(gè)緩存。我們希望的是一個(gè)人使用過(guò),其他人也可以使用,session沒(méi)有這種效果。
(3)二級(jí)緩存是獨(dú)立于Hibernate的軟件部件,屬于第三方的產(chǎn)品,多個(gè)廠商和組織都提供有緩存產(chǎn)品,例如,EHCache和OSCache等等。在Hibernate中使用二級(jí)緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪個(gè)廠家的緩存產(chǎn)品,接著需要配置該緩存產(chǎn)品自己的配置文件,最后要配置Hibernate中的哪些實(shí)體對(duì)象要納入到二級(jí)緩存的管理中。明白了二級(jí)緩存原理和有了這個(gè)思路后,很容易配置起Hibernate的二級(jí)緩存。擴(kuò)展知識(shí):一個(gè)SessionFactory可以關(guān)聯(lián)一個(gè)二級(jí)緩存,也即一個(gè)二級(jí)緩存只能負(fù)責(zé)緩存一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),當(dāng)使用Hibernate 的二級(jí)緩存后,注意不要有其他的應(yīng)用或SessionFactory來(lái)更改當(dāng)前數(shù)據(jù)庫(kù)中的數(shù)據(jù),這樣緩存的數(shù)據(jù)就會(huì)與數(shù)據(jù)庫(kù)中的實(shí)際數(shù)據(jù)不一致
6)Spring
什么是spring的IOC? AOP
Servlet
1.servlet的執(zhí)行順序
servlet分兩部分,訪問(wèn)servlet配置和servlet-mapping配置,
到本地的hosts文件中查找是否存在該域名對(duì)應(yīng)的IP地址
127.0.0.1,8080 :找到tomcat服務(wù)器,在tomcat的webapps目錄下找 day10的目錄,訪問(wèn)/first? ? 資源名稱(chēng),tomcat服務(wù)器啟動(dòng)時(shí),首先加載webapps中的每個(gè)web應(yīng)用的web.xml配置文件。在day10的web.xml中查找是否有匹配的url-pattern的內(nèi)容(用/first去匹配),如果找到匹配的url-pattern,則使用當(dāng)前servlet-name的名稱(chēng)到web.xml文件中查詢(xún)是否相同名稱(chēng)的servlet配置,如果找到,則取出對(duì)應(yīng)的servlet配置信息中的servlet-class內(nèi)容:(字符串: bao.a_servlet.FirstServlet),通過(guò)反射:a)構(gòu)造FirstServlet的對(duì)象b)然后調(diào)用FirstServlet里面的方法
2.Servlet重要的四個(gè)生命周期方法:
構(gòu)造方法: 創(chuàng)建servlet對(duì)象的時(shí)候調(diào)用。默認(rèn)情況下,第一次訪問(wèn)servlet的時(shí)候創(chuàng)建servlet對(duì)象 只調(diào)用1次。證明servlet對(duì)象在tomcat是單實(shí)例的。
init方法: 創(chuàng)建完servlet對(duì)象的時(shí)候調(diào)用。只調(diào)用1次。
service方法: 每次發(fā)出請(qǐng)求時(shí)調(diào)用。調(diào)用n次。
destroy方法: 銷(xiāo)毀servlet對(duì)象的時(shí)候調(diào)用。停止服務(wù)器或者重新部署web應(yīng)用時(shí)銷(xiāo)毀servlet對(duì)象。只調(diào)用1次。
3.ServletConfig對(duì)象
ServletConfig對(duì)象: 主要是用于加載servlet的初始化參數(shù)。在一個(gè)web應(yīng)用可以存在多個(gè)ServletConfig對(duì)象(一個(gè)Servlet對(duì)應(yīng)一個(gè)ServletConfig對(duì)象)
創(chuàng)建時(shí)機(jī): 在創(chuàng)建完servlet對(duì)象之后,在調(diào)用init方法之前創(chuàng)建。
得到對(duì)象: 直接從有參數(shù)的init方法中得到?。?!
4. ServletContext對(duì)象
ServletContext對(duì)象 ,叫做Servlet的上下文對(duì)象。表示一個(gè)當(dāng)前的web應(yīng)用環(huán)境。一個(gè)web應(yīng)用中只有一 個(gè)ServletContext對(duì)象
創(chuàng)建時(shí)機(jī):加載web應(yīng)用時(shí)創(chuàng)建ServletContext對(duì)象。
得到對(duì)象: 從ServletConfig對(duì)象的getServletContext方法得到
5.域?qū)ο螅鹤饔檬怯糜诒4鏀?shù)據(jù),獲取數(shù)據(jù)??梢栽诓煌膭?dòng)態(tài)資源之間共享數(shù)據(jù)
參數(shù)傳遞有兩種方法
方案1: 可以通過(guò)傳遞參數(shù)的形式,共享數(shù)據(jù)。局限:只能傳遞字符串類(lèi)型。
方案2: 可以使用域?qū)ο蠊蚕頂?shù)據(jù),好處:可以共享任何類(lèi)型的數(shù)據(jù)?。。。?!
ServletContext域?qū)ο螅鹤饔梅秶谡麄€(gè)web應(yīng)用中有效!?。?br>
所有域?qū)ο螅?/p>
HttpServletRequet 域?qū)ο?/p>
ServletContext域?qū)ο?/p>
HttpSession 域?qū)ο?/p>
PageContext域?qū)ο?/p>
6.轉(zhuǎn)發(fā)和重定向
RequestDispatcher getRequestDispatcher(java.lang.String path)
1)轉(zhuǎn)發(fā)
a)地址欄不會(huì)改變
b)轉(zhuǎn)發(fā)只能轉(zhuǎn)發(fā)到當(dāng)前web應(yīng)用內(nèi)的資源
c)可以在轉(zhuǎn)發(fā)過(guò)程中,可以把數(shù)據(jù)保存到request域?qū)ο笾?/p>
2)重定向
a)地址欄會(huì)改變,變成重定向到地址。
b)重定向可以跳轉(zhuǎn)到當(dāng)前web應(yīng)用,或其他web應(yīng)用,甚至是外部域名網(wǎng)站。
c)不能再重定向的過(guò)程,把數(shù)據(jù)保存到request中。
數(shù)據(jù)庫(kù)
1、數(shù)據(jù)庫(kù)三范式是什么?
2.JDBC:使用java代碼(程序)發(fā)送sql語(yǔ)句的技術(shù),就是jdbc技術(shù)!
使用JDBC連接數(shù)據(jù)庫(kù)前提:數(shù)據(jù)庫(kù)的IP地址:"jdbc:mysql://localhost:3306/day17" ?
// jdbc協(xié)議:數(shù)據(jù)庫(kù)子協(xié)議:主機(jī):端口/連接的數(shù)據(jù)庫(kù) ,數(shù)據(jù)庫(kù)用戶(hù)名,密碼
使用JDBC連接數(shù)據(jù)庫(kù)的第一種方法:
第一種方法
1.創(chuàng)建驅(qū)動(dòng)程序類(lèi)對(duì)象
2設(shè)置用戶(hù)名和密碼
3.連接數(shù)據(jù)庫(kù),返回連接對(duì)象
第二種方法
使用驅(qū)動(dòng)管理器類(lèi)連接數(shù)據(jù)庫(kù)(注冊(cè)了兩次,沒(méi)必要)
Driver driver = new com.mysql.jdbc.Driver();
/1.注冊(cè)驅(qū)動(dòng)程序(可以注冊(cè)多個(gè)驅(qū)動(dòng)程序)
DriverManager.registerDriver(driver);
/2.連接到具體的數(shù)據(jù)庫(kù)
Connection conn = DriverManager.getConnection(url, user, password);
(推薦使用第二種)
JDBC接口核心的API
|- Connection接口: 表示java程序和數(shù)據(jù)庫(kù)的連接對(duì)象。
|- Statement createStatement() : 創(chuàng)建Statement對(duì)象
|- PreparedStatement prepareStatement(String sql)? 創(chuàng)建PreparedStatement對(duì)象
|- CallableStatement prepareCall(String sql) 創(chuàng)建CallableStatement對(duì)象
|- Statement接口: 用于執(zhí)行靜態(tài)的sql語(yǔ)句
|- int executeUpdate(String sql)? : 執(zhí)行靜態(tài)的更新sql語(yǔ)句(DDL,DML)
|- ResultSet executeQuery(String sql)? :執(zhí)行的靜態(tài)的查詢(xún)sql語(yǔ)句(DQL)
|-PreparedStatement接口:用于執(zhí)行預(yù)編譯sql語(yǔ)句
|- int executeUpdate() : 執(zhí)行預(yù)編譯的更新sql語(yǔ)句(DDL,DML)
|-ResultSet executeQuery()? : 執(zhí)行預(yù)編譯的查詢(xún)sql語(yǔ)句(DQL)
|-CallableStatement接口:用于執(zhí)行存儲(chǔ)過(guò)程的sql語(yǔ)句(call xxx)
|-ResultSet executeQuery()? : 調(diào)用存儲(chǔ)過(guò)程的方法
//7.關(guān)閉連接(順序:后打開(kāi)的先關(guān)閉)if(stmt!=null)try {stmt.close();} catch (SQLException,再關(guān) conn) {
3.PreparedStatement vs Statment
String sql = "UPDATE student SET NAME=? WHERE id=?"; //?表示一個(gè)參數(shù)的占位符(預(yù)編譯sql語(yǔ)句有占位符號(hào))
1)語(yǔ)法不同:PreparedStatement可以使用預(yù)編譯的sql,而Statment只能使用靜態(tài)的sql
2)效率不同: PreparedStatement可以使用sql緩存區(qū),效率比Statment高
3)安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。
推薦使用PreparedStatement
JDBC優(yōu)化:
BeanUtils組件:程序中對(duì)javabean的操作很頻繁, 所以apache提供了一套開(kāi)源的api,方便對(duì)javabean的操作!即BeanUtils組件。
BeanUtils組件,? 作用是簡(jiǎn)化javabean的操作!
方法1: 對(duì)象屬性的拷貝
BeanUtils.copyProperty(admin, "userName", "jack");
BeanUtils.setProperty(admin, "age", 18);
方法2: 對(duì)象的拷貝
BeanUtils.copyProperties(newAdmin, admin);
方法3: map數(shù)據(jù)拷貝到j(luò)avabean中
【注意:map中的key要與javabean的屬性名稱(chēng)一致】
BeanUtils.populate(adminMap, map);
元數(shù)據(jù):
在jdbc中獲取數(shù)據(jù)庫(kù)的定義,例如:數(shù)據(jù)庫(kù)、表、列的定義信息。就用到元數(shù)據(jù)。
在jdbc中可以使用: 數(shù)據(jù)庫(kù)元數(shù)據(jù)、參數(shù)元數(shù)據(jù)、結(jié)果集元數(shù)據(jù)
(元數(shù)據(jù)定義相關(guān)api,? ..MetaData)
DatabaseMetaData metaData = conn.getMetaData();// alt + shift + L? 快速獲取方法返回值
System.out.println(metaData.getUserName());
可以簡(jiǎn)化dao層,具體看代碼
DbUtils組件:簡(jiǎn)化jdbc操作
連接池
涉及頻繁的連接的打開(kāi)、關(guān)閉,影響程序的運(yùn)行效率!預(yù)先創(chuàng)建一組連接,有的時(shí)候每次取出一個(gè); 用完后,放回;
學(xué)習(xí)連接池:
1.自定義一個(gè)連接池
2.學(xué)習(xí)優(yōu)秀的連接池組件DBCP ?C3P0
設(shè)計(jì)模式
代理:
如果對(duì)某個(gè)接口中的某個(gè)指定的方法的功能進(jìn)行擴(kuò)展,而不想實(shí)現(xiàn)接口里所有方法,可以使用(動(dòng)態(tài))代理模式!
Java中代理模式:靜態(tài)/動(dòng)態(tài)/Cglib代理(spring)
使用動(dòng)態(tài)代理,可以監(jiān)測(cè)接口中方法的執(zhí)行!
如何對(duì)Connection對(duì)象,生成一個(gè)代理對(duì)象:
|--Proxy
static Object newProxyInstance(
ClassLoader loader,? ? 當(dāng)前使用的類(lèi)加載器
Class[] interfaces,? 目標(biāo)對(duì)象(Connection)實(shí)現(xiàn)的接口類(lèi)型
InvocationHandler h? ? 事件處理器:當(dāng)執(zhí)行上面接口中的方法的時(shí)候,就會(huì)自動(dòng)觸發(fā)事件處理器代碼,把當(dāng)前執(zhí)行的方法(method)作為參數(shù)傳入。
),
寫(xiě)一個(gè)Singleton出來(lái)。
第一種:飽漢模式
public class SingleTon {
private SingleTon(){
}
//實(shí)例化放在靜態(tài)代碼塊里可提高程序的執(zhí)行效率,但也可能更占用空間
private final static SingleTon instance = new SingleTon();
public static SingleTon getInstance(){
return instance;
}
}
第二種:饑漢模式
public class SingleTon {
private SingleTon(){}
private static instance = null;//new SingleTon();
public static synchronized SingleTon getInstance(){
if(instance == null)
instance = new SingleTon();
return instance;
}
}
基礎(chǔ)
異常
多線程
網(wǎng)絡(luò)
HTML
html的標(biāo)簽作用:用于描述一個(gè)網(wǎng)頁(yè)的結(jié)構(gòu)的,如果要操作數(shù)據(jù)的樣式,是要通過(guò)標(biāo)簽的熟悉操作的.
1.常用標(biāo)簽
<h1 align=“center”>~<h6>表示文章大標(biāo)題,而且字體依次漸小,對(duì)齊。
文章是是段落的,段落用<p></p>標(biāo)簽,段落一般縮進(jìn)兩個(gè)空格, 一般這么干<p>  </p>
水的化學(xué)式:H<sub>2<sub>O ?下標(biāo)簽
2的16次方:2<sup>16</sup> 上標(biāo)簽
<hr/> :水平分割線
<br/>:換行
<pre>一首詩(shī)</pre>原樣標(biāo)簽,保留編寫(xiě)的時(shí)候的空格和換行符號(hào)(注意:使用這個(gè)標(biāo)簽的空格要么用table鍵要么用空格鍵要一致,否則出現(xiàn)錯(cuò)誤,這里建議用空格)
有序的列表標(biāo)簽:ol li
<ol type=“a”>
<li>烤魚(yú)<li>
<li>火鍋<li>
</ol>
無(wú)序的的列表標(biāo)簽:ul li 前面默認(rèn)是小圓點(diǎn),也可以改type=“square”
項(xiàng)目標(biāo)簽dl dt dd ?
<dl>
<dt>技術(shù)總監(jiān)</dt>
<dd>碼農(nóng)<dd>// dd是可以縮進(jìn)一個(gè)table鍵的
<dt>人事總監(jiān)</dt>
<dd>妹紙1<dd>
</dl>
<div></div> ? ?div標(biāo)簽的內(nèi)容會(huì)獨(dú)立占一行。
CSS+Div布局方式,Div才擁有,<span>行內(nèi)標(biāo)簽也才有用
2.超鏈接
<a>超鏈接標(biāo)簽
a標(biāo)簽常用的屬性
?href:用于指定鏈接的資源,
target:設(shè)置打開(kāi)資源的目標(biāo)。它又有兩個(gè)常用屬性:_Blank 在獨(dú)立的窗口打開(kāi)新資源,_self 在當(dāng)前窗口打開(kāi)新資源。
file:file協(xié)議(文件協(xié)議)這種協(xié)議主要用于搜索本地機(jī)器的資源文件
格式:file:\\\f:\美女\1.jpg
表格標(biāo)簽<table>
<table> 表格
?<tr>行?
<td>單元格
<th>表頭 ?默認(rèn)的樣式是居中,加粗
<caption>表格的標(biāo)題
表格常用屬性:、
border設(shè)置表格的邊框
width:設(shè)置表格的寬度
height:設(shè)置表格的高度
3.框架標(biāo)簽
framSet:一個(gè)frameSet可以把一個(gè)頁(yè)面切割成多份。只能按照行或者列切割
frame 不能被切割的,frame是位于frameSet中. src鏈接的那個(gè)頁(yè)面
<frameset rows="20%,70%,*">
<frame src="top.html"/>
<frameset>
注意:frameSet標(biāo)簽不能用于body標(biāo)簽體內(nèi)容,有body不需要frameset,有body就不需要frameset
4.實(shí)體標(biāo)簽
為什么要學(xué)實(shí)體標(biāo)簽:因?yàn)?lt; >空格等一些符號(hào)在html頁(yè)面中是有特殊含義,這些字體如果需要在頁(yè)面中顯示,這時(shí)候就應(yīng)該使用實(shí)體標(biāo)簽。
空格。 ;大于號(hào) <; 大于號(hào) ?>