基礎部分part1
【1】Java基本類型
解:基本數據類型:byte short int long float double char boolean
Java基本數據類型在內存中的存儲
1)基本數據類型的存儲原理:全部簡單的數據類型不存在"引用"的概念,基本數據類型都是直接存儲在內存中的內存棧上的,數據自己的值就是存儲在棧空間裏面的。
2)引用數據類型的存儲原理:引用類型繼承於Object類(也是引用型)都是按照Java裏面存儲對象的內存模型來進行數據存儲的,使用Java內存堆和內存棧這種類型的數據存儲。「引用」是存儲在有序的內存棧上的,而對象自己的值存儲在內存堆上的;
區別:基本數據類型和引用數據類型的區別主要在於基本數據類型是分配在棧上的,而引用類型是分配在堆上的;
//== equals() 操做符 方法
public class Test
{
public static void main(String[] args)
{
//基本數據類型 比較用 == 比較的是值
String a ="abc";
String b = "abc";
System.out.println(a == b);
String s1 = "a";
String s2 = new String("a");
String s3 = new String("a");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s2.equals(s3));
}
}
/*
---------- java ----------
true
false
true
true
a==b
輸出完成 (耗時 0 秒) - 正常終止
*/
【3】Java反射
解答:Java反射 傳遞class,能夠動態生成該類,取得這個類的全部信息,包括裏面的屬性、方法以及構造函數,甚至能夠取得其父類或父接口裏面的內容
obj.getClass().getDeclaredMethods();//取得obj類中本身定義的方法,包括私有的方法
obj.getClass().getMethods();//取得obj類中本身定義的方法及繼承過來的方法,但私有方法得不到
一樣,對於field也是同樣。
Java的反射機制:在運行狀態,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能。
class:
1)一個描述類的類,封裝了描述方法method、描述字段filed、描述構造器constructor
2)反射能夠獲得的信息:某個類的數據成員名、方法、構造器、實現了哪些接口
3)每一個類,jre都爲其保留一個不變的class類型的對象。一個class對象包含了特定某個類的有關信息。
4)class對象只能由系統創建對象
5)一個類在JVM中只會有一個class實例
【3】this、super
【4】Java中建立對象的方法
一、經過new關鍵字建立對象
二、利用Java的反射機制,經過java.lang.Class或者java.lang.reflect.Constructor建立對象
三、實現Cloneable接口,重寫Object.clone()方法建立對象
四、實現序列化serialiable接口,經過反序列化,ObjectInputStream的readObject()方法建立對象
五、String str="abc"直接由jvm建立 或者 使用字符串操做符「+」 String str1 = "a" + "bc"由jvm建立
【5】java爲何可以跨平臺運行
java程序編譯以後的代碼不能被硬件系統直接運行的代碼,而是一種「中間碼」--字節碼。不一樣的硬件平臺上安裝有不一樣的java虛擬機(JVM),由JVM來把字節碼再「翻譯」成所對應的硬件平臺可以執行的代碼。所以對於Java編程者來講,不考慮硬件平臺是什麼。
【6】整型數據轉化爲字符串的方式
一、直接在數字後面加 空格
二、使用String.valueOf(int i )
三、Integer.toString(i);
int轉String
int i;
1)String s = String.valueOf(i); //valueOf(Type patameter): 返回類型參數的字符串表示形式
2)String s = Interger.toString(i); //toString() 返回表示此整數值的字符串對象
3)String s = "" + i;
String轉int
1)int i = Integer.parseInt([String]); //parseInt(String)方法是類Integer的靜態方法,做用講形參s轉化爲整數
2)int i = Integer.valueOf(my_str).intValue() //valueOf將形參s轉化爲Integer對象,再調用intValue方法,將對象表示形式轉化爲基本數據
String數組轉字符串
利用StringBuffer / StringBuilder的append()方法
package com.wyp.string; public class StringTest { public static void main(String[] args) { // TODO 自動生成的方法存根
String[] arr = {"0","1","2"}; StringBuffer stringbuffer = new StringBuffer(); StringBuilder stringbuilder = new StringBuilder(); for(int i=0; i<arr.length; i++) { stringbuffer.append(arr[i]); } for(int i=0; i<arr.length; i++) { stringbuilder.append(arr[i]); } String s1 = stringbuffer.toString(); String s2 = stringbuilder.toString(); System.out.println(s1); System.out.println(s2); } }
char數組轉字符串javascript
String st = string.copyValueof(char arr[]);html
String st = new String(char arr[]);java
字符串轉數組mysql
String st = "abc",st能夠調用一下函數spring
split():若是用".""|"做爲分隔符,須要以下寫法String.split("\.") 空格無需sql
toCharArray() : 將此字符串轉換爲新的字符數組數據庫
getByte():將字符串轉化爲一個序列使用平臺的默認字符集字節,結果存放到一個新的數組。編程
replace():設計模式
charAt(int index) 返回指定索引處的char值數組
【7】String是基本數據類型嗎?能不能寫個類繼承String?
String是引用數據類型;String是final的類,是不能夠被繼承的。
【8】& &&的區別
均可以用做邏輯與的運算符。
&&短路運算符,若是第一個表達式爲false,則再也不計算第二個表達式
&還能夠用做位運算符,當&操做符兩邊的表達式不是boolean類型時,&表示按位與操做。
【9】switch語句中的條件
用於switch判斷的類型:byte、short、int、char(JDK 1.6),還有枚舉類型,在JDK1.7後添加了對String類型的判斷。case語句中少些了break,編譯不會報錯,可是會一直執行以後全部的case條件下的語句而再也不判斷,知道default語句。沒有符合條件的case語句,就會執行default下的代碼塊,default並非必須的,也能夠不寫。
【10】short s1=1;s1=s1+1; 錯誤?short s1=1;s1+=1; 錯誤?
s1+1運算時會自動提高表達式的類型,因此結果是int型。
+=是java語言規定的運算符,java編譯器會對他進行特殊處理,能夠編譯經過。
【11】char爲何能存儲一個漢字
char型變量是用來存儲Unicode編碼的字符的,Unicode編碼字符集中包含了全世界全部的字體。
【12】用最有效率的辦法算出2乘以8等於幾?
2<<3 位移運算是最底層的運算,它直接操做的是二進制,故效率很快
【13】final修飾變量時,該變量是對象時,對象的值可不能夠改變?
final修飾的變量指的是引用不可變,對象的值是能夠改變的。
final關鍵字修飾一個變量時,是引用對象的地址值不能變,引用對象所指向的對象內容時能夠改變的。final變量永遠指向這個對象,是一個常量指針,而不是指向常量的指針。
final能夠用來修飾變量(類屬性、對象屬性、局部變量和形參)、方法(包括類方法和對象方法)和類
一、final修飾類
final修飾類不能被繼承,即不能擁有本身的子類。
二、final修飾的方法不能被重寫(能夠重載多個final修飾的方法)。由於重寫的前提是子類能夠從父類中繼承此方法,若是父類中final修飾的方法同時訪問控制權限爲private,將會致使子類中不能直接繼承到此方法,所以能夠在子類中定義相同的方法名和參數,此事再也不產生重寫與final的矛盾,而是在子類中從新定義了新的方法。
三、final修飾的變量值不可被改變。
final修飾的變量,不管是類屬性、對象屬性、形參仍是局部變量,這些變量都是須要進行顯示初始化(即爲其顯示指定初始值)。
四、final修飾變量後致使的"宏替換/宏變量"
指的是java代碼中在編譯期某些變量可以直接被其自己的值所替換,編譯到.class文件中。final修飾符修飾的變量在因爲其自己的特性,在編譯期就能直接肯定其值 ,且此值不可變。在編譯過程當中,能夠直接將其變量直接轉換成其值自己去表示。
【14】靜態變量和實例變量的區別?
靜態變量也稱爲類變量,歸全類全部,它不依賴某個對象,可經過類名直接訪問;而實例對象必須依存於某一實例,只能經過對象才能訪問它
【15】面對對象的基本特徵?
一、繼承:子類擁有父類一切非私有的屬性和方法。
二、封裝:封裝是把過程和數據包圍起來,對數據的訪問只能經過已定義的界面。面向對象計算始於這個基本概念,即現實世界能夠被描繪成一系列徹底自治、封裝的對象,這些對象經過一個受保護的接口訪問其餘對象。
三、多態性:同一事物的不一樣種表現形式。
四、抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,一遍更充分地注意與當前目標有關的方面。抽象並不打算了解所有問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面:過程抽象和數據抽象。
【16】做用域public private protected 以及不寫時的區別(當前類 同包 子孫類 其餘)
默認爲default
【17】overload 和 override的區別
overload(重載):發生在同一個類中,方法名相同,參數列表不一樣,與返回值無關,與final無關,與修飾符無關、與異常無關
override(重寫):發生在子類和父類之間,方法名相同、參數列表相同、返回值相同、不能是final的方法、重寫的方法不能有比父類方法更爲嚴格的修飾符權限、重寫的方法所拋出的異常不能比父類的更大
若是父類私有的方法,子類擁有方法簽名相同的方法,子類不屬於重寫父類的方法,該方法屬於子類的新方法
【18】構造器(構造方法)可不不能夠被重載或者重寫
構造器不能被繼承,故不能被重寫、但能夠被重載
1)構造器和方法的區別
一、功能不一樣:構造器是爲了建立一個類的實例,命名與類名相同,能夠有任何訪問的修飾,無返回值。
this:
方法引用this指向的正在執行方法的類的實例。靜態方法不能使用this關鍵字,構造器的this指向同一個類中,不一樣參數列表的另外一個構造器。
在構造器中,若是要使用關鍵字this,必須放在第一行。
super:
構造器和方法,都用關鍵字super指向超類,可是用法不同,方法用這個關鍵字去執行被重載的超類中的方法。
使用super調用超類中的構造器,這行代碼必須放在第一行。
【19】Java有沒有多繼承
java中沒有多繼承,可是能夠多實現,即一個類實現多個接口。
雖然沒有多繼承,可是java中接口能夠近似的實現多繼承,那就是接口;
接口和接口之間能夠進行多繼承
【20】抽象類和接口的區別
一、抽象類繼承與object接口不繼承object
二、抽象類有構造器,接口中沒有構造器
三、抽象類中能夠有普通成員變量和常量,接口中只能有常量,並且只能是public static final不寫默認
四、抽象類中能夠有抽象方法,也能夠有普通方法,接口中只能有抽象的方法,並且修飾符只能是public abstract 不寫默認
五、抽象類中能夠有final的方法,接口中不能有final的方法
六、抽象類只能是單繼承、多實現;接口是能夠多繼承其餘接口,可是不能實現接口和不能繼承其餘類
七、抽象類中能夠有靜態的方法,接口中不能夠
【21】java中實現多態的機制是什麼
重寫、重載、父類的聲明指向子類的對象
【22】int integer的區別
int是java的基本數據類型
integer是基本類型包裝類。
初始化值:int:0 integer : null
其中integer提供了一些對整數操做的方法,定義了integer型數值的最值,其餘基本類型也有對應的包裝類,基本類型包裝類的出現,是的java徹底面對對象
【23】String和StringBuffer的區別?StringBuffer和StringBuilder區別?
String是不可變的,對String類的任何改變都會返回一個新的String的對象。
StringBuffer是可變的,對StringBuffer中的內容修改都是當前這個對象。
String重寫了equals方法和hashCode方法,StringBuffer沒有重寫equals方法。
String是final的類。StringBuffer不是。
String建立的字符串是在常量池中,建立的變量初始化一次,若是再對該字符串改變會產生新的字符串地址值,StringBuffer是在堆中建立對象,當對字符串改變時不會產生新的字符串地址值,若是對字符串進行頻繁修改的話建議使用StringBuffer,以節省內存。
StringBuffer和StringBuilder,StringBuffer是線程安全的,StringBuilder是線程不安全的。當不考慮併發問題時候,用StringBuilder。
【24】String s = new String("xyz"); 建立了幾個String Object?
兩個對象,一個是「xyz」 一個是指向「xyz」的引用對象s
【25】數組中有沒有length()方法,String中有沒有length方法?
數組中沒有length()方法,可是有length屬性,String中有length()方法
【26】try{}裏面有一個return語句,那麼緊跟在這個try後的finally{}裏的code會不會被執行,何時執行,在return前仍是後?
a、finally中沒有return時候:先會執行try裏面的,return會執行可是沒有真正的return此時去執行了finally裏面的,而後再返回來執行return。
b、finally中有return時候(會有黃線警告):會先執行try裏面的,return會執行但沒有真正的return此時去執行了finally裏面的,而後執行finally裏面的return,直接返回。
【27】final finally finalize
final 用於聲明屬性、方法和類;分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally 是異常處理語句結構的一部分,表示老是執行
finalize 是object類的一個方法,在垃圾收集器執行的時候回調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。jvm不保證此方法總被調用
【28】== 和 equals()區別
== 比較的是兩個變量的內容和在內存中的地址值是否相同;若是比較兩個基本數據類型必須用「==」
equals()若是沒有重寫,和==意義同樣,可是若是重寫了,則會按照重寫的內容進行比較,javaBean規定當重寫equals時候必須重寫hashcode,若是不重寫會出現對象相同可是hashCode不一樣,這樣會出現問題。
hashSet存儲元素時候按照hashCode,若是重寫equals不重寫hashCode會致使同一個對象,存儲了兩次。
【29】error 和 exception的區別
error表示恢復不是不可能可是很困難的狀況下的一種嚴重問題,例如程序書寫錯誤、虛擬機錯誤等。
exception是一種設計和實現問題,若是程序運行正常,從不會發生的問題
error是能夠避免的,可是exception是不能夠避免的
【30】java的checked和unchecked異常
一、unchecked異常即運行時異常。即runtimeexception,不須要try catch throws機制去處理的異常
二、除了runtimeexception,其餘繼承自java.lang.exception的異常統稱爲checked exception。
【31】java中有幾種方法能夠實現線程?用什麼關鍵字修飾同步方法?stop 和 suspend 方法爲什麼不推薦使用?
一、實現線程的兩種方法:
繼承Thread類,重寫run方法,再調用start方法。
實現Runnable接口,重寫run方法。再傳給Thread構造器,調用時調用Thread的start方法
二、用synchronized關鍵字修飾同步方法
三、不使用stop方法,是由於它不安全。它會解除由線程獲取的全部鎖定,並且若是對象處於一種並不連貫狀態,那麼其餘線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。
s
uspend方法容易發生死鎖。調用suspend的時候,目標線程會聽下來,但卻仍然持有在這以前得到的鎖定。此時,其餘任何線程都不能訪問鎖定的資源。除非被「掛起的」線程恢復運行,對任何線程來講,若是他們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會形成死鎖。因此不該該使用suspend,而應在本身的thread類中置入一個標誌,指出線程應該活動仍是掛起。若標誌指出線程應該掛起,使用wait命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify從新啓動線程。
【32】sleep 和 wait區別?
sleep是線程類Thread的方法,致使此線程暫停執行指定時間,給執行機會到其餘線程,可是監控狀態依然保持,到時後自動恢復。調用sleep不會釋放對象鎖。
wait是object類的方法,對此對象調用wait方法致使本線程方法對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法後本線程才進入對象鎖定池準備獲取對象鎖進入運行狀態。
【33】當一個線程進入一個對象的一個synchronized方法後,其餘線程是否可進入此對象的其餘方法?
一、其餘對象前是否加了synchronized關鍵字,若是沒加,就能夠
二、若是這個方法內部調用了wait,則能夠進入其餘synchronized方法。
三、若是其餘各方法都加了synchronized關鍵字,而且內部沒有調用wait方法,則不能。
四、若是其餘方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,由於非靜態的方法用的是this。
【34】線程的基本概念、線程的基本狀態以及狀態之間的關係
一個新的線程可使用兩種方法建立:一、繼承thread類。二、實現runnable接口,建立以後經過start方法進入到運行狀態,在運行狀態中可使用yield方法進行禮讓,可是仍然能夠進行,若是如今一個線程須要暫停的話,可使用suspend(暫時掛起,resume表示掛起恢復)、sleep、wait方法,若是如今讓線程再也不執行,則能夠經過stop結束,run方法運行完也表示結束。其中suspend、resume、stop方法均可能產生死鎖的問題,因此不建議使用了。應該經過設置標示位來控制線程的中止運行。
一個程序中能夠有多條執行線索同時執行,一個線程就是程序中的一條執行線索,每一個線程上都關聯有要執行的代碼,便可以有多段程序代碼同時運行,每一個程序至少都有一個線程,即main方法執行的那個線程。若是隻是一個CPU,它怎麼可以同時執行多段程序?從宏觀上來看,CPU一下子執行a線索,一會執行b線索,切換時間很快,給人的感受是a、b在同時執行,比如你們在一個辦公室上網,只有一條連接到外部網線,其實,這條網線一會爲a傳數據,一會爲b傳數據,因爲切換時間很短暫,你們感受都在同時上網。
狀態:就緒、運行、synchronized阻塞,wait和sleep掛起、結束。wait必須在synchronized內部調用。
調用線程的start方法後線程進入就緒狀態,線程調度系統將就緒狀態的線程轉換爲運行狀態,遇到synchronized語句時,由運行狀態轉爲阻塞,當synchronized得到鎖後,有阻塞轉爲運行,在這種狀況下能夠調用wait方法轉爲掛起狀態,當線程關聯的代碼執行完後,線程變爲結束狀態。
【35】
數據庫部分part2
【1】觸發器
觸發器是一種特殊的存儲過程,主要是經過事件而觸發並被執行的,它能夠強化約束,來維護數據的完整性和一致性,能夠跟蹤數據庫內的操做從而不容許未經許可的更新和變化。能夠聯級運算。如某表上的觸發器上包含對另外一張表的數據操做。而該操做又會致使該表觸發器被觸發。
【2】存儲過程
存儲過程是一個預編譯的sql語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次sql,使用存儲過程就比單純sql語句執行要快。能夠用一個命令對象來調用存儲過程。
【3】刪除表的方法
delete truncate drop
drop是刪除表,使用drop以後表的結構和表的數據都會被刪除,truncate和delete是刪除表中的數據,但不刪除表本省,truncate和delete相比,truncate要快不少,可是缺點是沒法回滾,包括索引等都會被成初始值,數據就沒法恢復。
【4】索引
索引就是一種特殊的查詢表,書戶口的搜索引擎能夠利用他加速對數據的檢索。它很相似現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。索引能夠是惟一的,建立索引容許指定單個列或者多個列。
缺點是它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。
【5】事務?鎖?
事務處理:數據的操做是一個總體,能夠理解爲一個完整的業務,若是其中出錯,則全部的操做都應該再也不執行,並且迴歸到最原始的狀態,而這一個操做流程就是 事務的操做。全部的事物操做都針對每個session進行的,每個連接到數據庫的用戶都成爲一個session,每個session之間彼此獨立,不會有任何的通信,而每個session獨享本身的事務控制,而事務控制之中有兩個命令:rollback和commit。
問題出現死鎖:例如某一個session在更新數據時尚未提交事務,其餘session是沒法更新的,必須等待以前的session提交後才能夠。
解釋:
事務就是被綁定在一塊兒做爲一個邏輯工做單元的SQL語句分組,若是任何一個語句操做失敗那麼整個操做就會被失敗,之後的操做就會回滾到操做以前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就可使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性、一致性、隔離性和持久性。
鎖:
在全部的DBMS中,鎖是實現事務的關鍵。鎖能夠保證事務的完整性和併發性。與現實生活中的鎖同樣,它可使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構,鎖還分級別。
【6】視圖?遊標?
視圖是一種虛擬的表,具備和物理表相同得功能,能夠對視圖進行增、改、查操做,視圖一般是有一個表或者多個表的行或列的本身。對視圖的修改不影響基本表。使得或者數據更容易,相比多表查詢。
遊標:遊動的光標。遊標是映射在結果集中一行數據上的位置實體,有了遊標,用戶就能夠訪問結果集中任意一行數據了,將遊標放置到某行後,便可對該行數據進行操做。例如:提取當前行的數據。
遊標是對查詢出來的結果集做爲一個單元來有效的處理。遊標能夠定在該單元中額特定行,從結果集的當前行檢索一行或多行,能夠對結果集當前行作修改。通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要。
【7】錶鏈接方式?
內鏈接:只有兩個元素表相匹配的才能在結果集中顯示
自鏈接:本身跟本身關聯查詢,數據表使用不一樣的別名。
外鏈接:
-
左外鏈接 左邊爲驅動表,驅動表的數據所有顯示,匹配表的不匹配的不會顯示。
-
右外鏈接:右邊爲驅動表,驅動表的數據所有顯示,匹配日表不匹配的不會顯示。
-
全外鏈接:鏈接的表中不匹配的數據所有都會顯示出來。
交叉鏈接:笛卡爾效應,顯示的結果是連接表數的乘積。
【8】主鍵?外鍵?
主鍵是本表中是唯一的,不可惟空的,外鍵能夠重複能夠惟空;
外鍵和另外一張表的主鍵關聯,不能建立對應表中不存儲的外鍵。
【9】在數據庫中查詢語句速度很慢,如何優化?
解答:
一、建索引
二、減小表之間的關聯
三、優化sql,儘可能讓sql很快定位數據,不要讓sql作全表查詢,應該走索引,吧數據量大的表排在前面。
四、簡化查詢字段,沒用的字段不要,已經對返回結果的控制,儘可能返回少許數據。
五、儘可能用preparedStatement來查詢,不要用Statement
【10】數據庫三範式
第一範式(1NF)
第二範式(2NF)
第三範式(3NF)
【11】union 和 union all有什麼不一樣?
union在進行表連接後 會篩選掉重複的記錄,因此在表連接後對所產生的結果集進行排序運算。刪除重複的記錄再返回結果。實際大部分時不會產生重複的記錄,最多見的是過程表和歷史表union
union all只是簡單的將兩個結果合併後就返回。這樣,若是返回的兩個結果集中有重複的數據,那麼返回的結果集就會包含重複的數據了。
從效率上說,union all要比union快不少,因此,若是能夠確認合併的兩個結果集中不包含重複的數據的話,那麼就使用union all
【12】用JDBC如何調用存儲過程
package com.wyp.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
public class JdbcTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成的方法存根
Connection cn = null;
CallableStatement cstmt = null;
try {
//這裏最好不要這麼幹,由於驅動名寫死在程序中了
Class.forName("com.mysql.jdbc.Driver");
//實際項目中 應用DataSource數據 ,若是用框架 這個數據源不須要要編碼建立,只需
//DataSource ds = context.loopup() cn = ds.getConnection();
cn = DriverManager.getConnection("jdbc:mysql:///test", "root", "");
cstmt = cn.prepareCall("{call insert_Student(?,?,?)}");
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.setString(1, "wu");
cstmt.setInt(2, 25);
cstmt.execute();
//get第幾個 不一樣數據庫不同,建議不寫
System.out.println(cstmt.getString(3));
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(cstmt != null)
cstmt.close();
if(cn != null)
cn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
}
【13】JDBC中的PreparedStatement相比Statement的好處
一、提升性能
二、防止sql注入
【14】什麼是防止sql注入
【15】JDBC鏈接數據庫
【20】Oracle 和 MySQL的區別
一、庫函數不一樣
二、Oracle是用表空間來管理的,MySQL不是
三、顯示當前全部的表、用戶、改變鏈接用戶、顯示當前鏈接用戶、執行外部腳本的語句的不一樣。
四、分頁查詢,MySQL 用limit oracle用rownum
五、sql的語法的不一樣
【21】varchar2 、 varchar 和 char區別
一、char的長度是固定的,而varchar2的長度是能夠變化的,好比,存儲字符串「abc」,對於char(20)表示存儲的字符將佔20個字節,包含17個空,而一樣的varchar2(20)只佔了3個字節,20 只是最大值,當你存儲的字符小於20時,按實際長度存儲
二、char的效率要被varchar2的效率高
三、目前varchar是varchar2的同義詞。工業標準呢的varchar類型能夠存儲空字符串,可是Oracle不能這樣作,儘管它保留了之後這樣子作的權利。Oraclei本身開發了一個數據類型varchar2,這個類型不是一個標準的varchar,他將在數據庫中varchar列能夠存儲空字符串的特定改成存儲null值,若是想有向後兼容的能力,Oracle建議使用varchar2而不是varchar。
【22】Statement和preparedstatement有什麼區別?
後者的效率比前者高,在使用preparedstatement對象執行sql時候,命令被數據庫編譯和解析,而後被放到命令緩衝區,而後每當執行同一個preparedstatement時候,他就被再解析一次,但不會被編譯,在緩衝區能夠發現預編譯的命令,並且能夠從新使用。
若是要寫insert update delete 最好使用preparedstatement,在有大量用戶的企業級應用軟件中,常常會執行相同的sql,使用preparedstatement會增長總體的性能。
xml部分part3
【1】解析技術
一、DOM:處理大型文件時其性能降低的很是厲害
二、SAX
三、DOM4J
四、JDOM
【2】xml技術的運用
【3】編程:用java解析xml方式
【4】xml的文檔定義
【5】xml和 html的區別
【6】xml文件和普通文件的區別
【7】JSON
JSON(javascript object notation)是一種輕量級的數據交換格式,主要用於傳送數據。
JSON能夠將JavaScript對象中表示的一組數據轉換爲字符串,
框架部分part7
【1】Structs2?
【2】hibernate
一、面向對象設計的軟件內部運行能夠理解爲在不斷建立各類新對象、創建對象之間的關係,調用對象方法來改變各個對象的狀態和對象消亡的過程,無論程序運行過程和操做怎麼樣,本質上都是獲得一個結果,程序上一個時刻和下一個時刻的運行結果的差別就表如今內存中的對象狀態發生了變化。
二、爲了在關機和內存空間不夠的情況下,保持程序的運行狀態,須要將內存中的對象狀態保持到
持久化設備和從持久化設備中恢復出對象的狀態,一般都是保存到關係數據庫來保存大量對象信息。從Java程序的運行功能上來說,保存對象狀態的功能相比系統運行的其餘功能來講,應該是一個很不起眼的附屬功能,java採用jdbc來實現這個功能,這個不起眼的功能卻要編寫大量的代碼,而作的事情僅僅是保存對象和恢復對象,而且那些大量的jdbc代碼並無什麼技術含量,基本上市採用一套例行公事的標準代碼模板來編寫,是一種苦活和重複性的工做。
三、經過數據庫保存java程序運行時產生的對象和恢復對象,其實就是實現了java對象與關心數據庫記錄的映射關係,稱爲ORM ,人們能夠經過封裝JDBC代碼來實現了這個功能,封裝出來的產品稱之爲ORM框架,hibernate就是其中一種流行的框架,使用hibernate框架,不用寫JDBC代碼,僅僅是調用一個save方法,就能夠將對象保存到關係數據庫中,僅僅是調用一個get方法,就能夠從數據庫中加載出一個對象。
四、使用hibernate基本流程:配置configuration對象,產生sessionfactory、建立session對象、啓動事務、完成CRUD操做,提交事務,關閉session。
五、使用hibernate時,先要配置hibernate.cfg.xml文件,其中配置數據庫鏈接信息和方言等,還要爲每一個實體配置相應的hbm.xml文件,hibernate.cfg.xml文件須要登記每一個hbm.xml文件。
六、在應用hibernate時,重點要了解session的緩存原理,級聯、延遲加載和hql查詢。
1)hibernate數據的三個狀態。
把數據庫比喻成一個登記簿,當咱們把信息登記到登記簿上的時候,這個過程就是持久化過程。當登記完成以後,登記簿上的數據就是持久態數據,所謂持久態就是一直存在的狀態。當咱們徐亞用數據的時候,就會從登記簿上查信息,咱們查到的信息記錄在臨時的紙張或者腦海裏,而後登記簿會放回原位,這時候臨時紙張上或者腦海裏的數據就是遊離態,隨時可能被遺忘,在hibernate中就是隨時會被銷燬的數據。瞬態數據和遊離態數據相似,我的信息還沒登記到登記簿上的時候,信息就是瞬態,一旦登記到登記簿上就變成持久態,而後再查詢到的就是遊離態。
a.瞬時狀態(臨時狀態)
當new對象時,處於瞬時狀態(若是程序運行玩了,該對象會被垃圾回收)
b.持久狀態
跟session有關,就是持久狀態
持久狀態的對象,任何的修改,都會影響到數據庫中與之對應的數據
c.託管狀態(遊離狀態)
當session不在管理對象時候,脫離了session的管理,處於託管狀態的對象,修改屬性,對數據庫數據沒有任何影響。
企業開發時,使用saveOrUpdate(obj);來替代save(obj)或update(obj)方法。
避免由於狀態的改變,致使方法出錯,saveOrUpdate( obj )
能夠根據obj的狀態,來選擇是save()仍是update()
2)load 和 get 區別
一、若是數據庫中,沒有userId的對象,若是經過get方法加載,則返回的是一個null;
若是經過load則返回一個代理對象,若是後面代碼調用user對象的某個屬性,會拋出objectNotFoundException.
二、load支持延遲加載,get不支持
3)getCurrentSession 和 openSession 區別
一、getCurrentSession建立的session會綁定到當前線程,而openSession不會
二、getCurrentSession建立的線程會在事務中回滾或事物提交後自動關閉,而openSession必須手動關閉。
4)工做原理
一、讀取並解析配置文件
二、讀取解析映射信息,建立sessionFactory
三、打卡session
四、建立事物transation
五、持久化操做
六、提交事務
七、關閉session
八、關閉sessionfactory
5)爲何要用hibernate?
一、對jdbc訪問數據庫的代碼作了封裝,大大簡化了數據庫訪問層繁瑣的重複性代碼
二、hibernate是一個基於JDBC的主流持久性框架,是一個優秀的ORM實現,它很大程度的簡化DAO的編程工做
三、hibernate使用java反射機制,而不是字節碼加強程序來實現透明性
6)hibernate如何延遲加載?
lazy策略爲延遲加載策略,hibernate經過jdk代碼對其進行實現,即便用延遲加載的對象,在獲取對象的時候返回的是對象的代理,而不是對象的真正的引用,只有在對象真正被調用的時候,hibernate纔會對其進行查詢,返回真正的對象。
這在某種程度上對性能祈禱必定的優化。hibernate的延遲加載還能夠減小程序與數據庫的鏈接次數,由於使用了延遲加載,hibernate將延緩執行sql數據,減小對數據庫的訪問次數,從而提升執行效率。
內部緩存存在hibernate中又叫一級緩存,屬於應用事務級緩存。
二級緩存:是sessionfactory級別緩存,它是屬於進程範圍貨羣集範圍的緩存,這一級別的緩存能夠進行配置和更改,而且能夠動態加載和卸載,hibernate還爲查詢結果提供了一個查詢緩存,依賴於二級緩存。
7)緩存
一級緩存 session緩存
一級緩存 session級緩存,其生命週期很短,與session相互對應。一級緩存由hibernate進行管理,屬於事務範圍的緩存。
當程序調用session的load、get、save、saveOrUpdate、update方法或查詢接口方法時,hibernate會對實體對象進行緩存;當經過load方法或get方法查詢實體對象時,hibernate會首先到緩存中查找,在找不到實體對象的狀況下,hibernate纔會發出sql語句到數據庫中查詢,從而提升了hibernate的使用效率。
二級緩存sessionfactory緩存
二級緩存是sessionfactory級的緩存,其生命週期與sessionfactory一致。二級緩存能夠在多個session之間共享,屬於進程範圍或羣集範圍的緩存。
二級緩存是一個可插拔的緩存插件,它的使用須要第三方緩存產品的支持。在hibernate框架中,經過hibernate配置文件配置二級緩存的使用策略。
注:對於二級緩存,可使用一些不常常更新的數據或參考的數據,此時其性能會獲得明顯的提高。例如一個新聞網站,當發佈一條熱點新聞時,會有成千上萬的訪問量,而此條新聞並無發生任何的變化,若是每個用戶訪問都要查詢數據庫,勢必對系統性能形成必定的影響,此時能夠考慮應用二級緩存。若是常常變換的數據則不該應用二級緩存。
8)優化hibernate
使用雙向一對多關聯,不使用單向一對多
靈活使用單向一對多
不使用一對一,用多對一取代
配置對象緩存,不適合集合緩存
一對多集合使用bag,多對多使用set
繼承類使用顯示多態
表字段要少,表關聯不要怕多,有二級緩存
9)hibernate的主鍵生成策略
一、
【3】ORM
對象到關係的映射
類-->表 對象-->表中的每一條數據 屬性-->表中的列 特殊的屬性-->主鍵(做爲每條書的標識)
【3】spring
設計模式part8
經典案例part9