1.Java基礎
1.集合框架的結構
Java集合框架中抽象有序列表的接口是(List),無序列表的接口是(Set),他們的共同父接口是( Collection),用於對集合進行特殊操作如排序的工具類是(Collections),他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
2.ArrayList&Vector&LinkedList的區別
ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差。
LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。
3.HashMap和HashTable的區別?
HashMap:是Map接口的一個實現類,在缺省情況下是非同步的。需要額外的同步機制。但HashMap的同步問題可通過Collections的一個靜態方法得到解決:``Map Collections.synchronizedMap(Map m)``這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多線程的環境中也是安全的。HashMap&Hashtable主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。
HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。而Hashtable不允許。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。
Hashtable:是同步的,可以安全地使用。而 HashMap 不是。因此,HashMap 更適合於單線程環境,而 Hashtable
適合於多線程環境。Hashtable 提供了對鍵的列舉(Enumeration)。
Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。
4.ArrayList&LinkList
ArrayList:底層是數組,所以存儲密度比LinkList大。結點中沒有鏈信息域,只有自身信息域。查詢比較方便。可以不限類型,不限大小(實際上限制大小,默認超過10個一般會緩沖自動擴張,對象引用-指針占用四個字節)。
LinkList:使用元素列表存儲。更占內存,因為它為每個節點存儲兩個引用。插入和刪除比較方便。
5.Set&Map
HashSet:HashSet由一個hash表實現,只能存儲一次。而TreeSet是有序的(由一個樹形結構來決定)。
Map:而key,value說的是map,HashMap是無序的,TreeMap是有序的。
6.描述Java中String,StringBuffer,StringBuilder的區別
1. 可變與不可變
String類中使用字符數組保存字符串,因為有“final”修飾符,所以可以知道string對象是不可變的。
StringBuilder與StringBuffer是使用字符數組保存字符串,可知這兩種對象都是可變的。(節省了內存)
2. 是否多線程安全
String中的對象是不可變的,也就可以理解為常量,顯然線程安全。
StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。
StringBuilder並沒有對方法進行加同步鎖,所以是非線程安全的。
(String&StringBuffer不能直接賦值字符串,兩個類的實例的值不能被改變)
7.擁有下列哪些引用類型的對象在虛擬機內存足夠的情況下不會被垃圾回收機制回收?
1. 弱引用
2. 軟引用
3. 虛引用
(強引用:類似StringBuffer類的對象,java不會回收你正在使用的對象)
8.java中最有效計算2*8的表達式是?
2<<3
表示2的二進制0000 0010,如果我們要變成16的話,其二進制為0001 0000(1*2^4),左移了三位,所以2<<3
9.默認情況下,Connection對象會在執行一條語句后自動提交,不利於事務的控制,如果要改變這種情況,需要調用Connection的( A )方法設置為手動提交
Connection.setAutoCommit(false);
Connection.rollback();
Connection.commit();
10.try{}里面有一個return語句,那么緊跟在這個try后的finally{}里的代碼會不會被執行,什么時候被執行?
finally無論如何都會執行,一般用來關閉資源(IO流),執行的時間為return之前
catch捕獲異常,一幫用來記錄日志
11.Connection的Close深入分析
臨時變量在棧中一般都會被釋放掉,為什么還需要conn.close() ?
復雜數據類型是存在堆里面,而棧只是對地址進行引用,一旦引用出棧,對象就會變成垃圾。
但是Connection比較特殊,它跟數據庫進行連接,一旦open狀態,就不會被垃圾機制回收掉。這就是為什么conn必須關閉的原因.
12.OverLoad&Override
重載:相同的方法名,不同的參數類型或者參數數量(可變參數int...a是不能實現重載)
重寫:參數列表必須和重寫方法相同,方法相同,添加final的方法不能被重寫,重寫的異常不能廣泛於父類的異常(只能更小)。
13.內部類
1. 成員內部類:跟外部類的變量地位平等,它可以訪問外部類的成員變量
創建方式:new OutClass().new Inner()
使用場景:ArrayList中的Iterator方法是通過AbstractList類中的Itr類實現Iterator接口
2. 靜態內部類:增加了static,所以可以直接使用
使用方式:OutClass02.Inner.show2()
使用場景:安卓項目R類中的常量存儲,為了進行分類,會使用靜態成員內部類進行存儲,可以直接訪問
3. 匿名內部類:**使用new 接口,順便把方法實現**。這個地方沒有類的名字
4. 局部內部類:放在方法里面的類,只有方法被調用的時候,類才會被使用
使用場景:當接口和類的方法一樣,這樣實現接口會產生沖突。所以先用一個類實現那個接口,再在里面新建兩個內部類,內部類分別實現不同的接口。但是這個類只被使用一次,那么就將這個類放在方法里面。(外部的成員變量必須使用final,因為對象存堆,方法存棧,final存進常量池里面,當方法調用完消失,對象被使用的時候變量還存在)
14.char能不能存儲漢字?
java char型變量是能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節,所以放一個中文是沒問題的
15.interface 和 abstract 的區別?
抽象類:用來extends,只能繼承一個。抽象類可以實現某些方法
接口:用來實現的,可以實現多個,方法具體是在子類中實現,這體現了多態性,成員默認都是public static final的,函數默認為abstract
16.String str1="abc" 和 String str1=new String("abc"); 這兩個的區別是什么?
String str1="abc"; 在編譯時已經在一個**常量池**中生成一個拷貝,其中str1中的"abc"是字符串常量,類加載的時候就初始化。用(st1==st2)true,st1&st2指向同一個對象。
String str1=new String("abc"); 的話,是在**堆上**分配內存,執行才初始化。用(st1==st2)比較的是地址符
st1,st2所產生的對象並不是同一個對象。
當String常量池方式被重新賦值的話,它會復制一份副本進行改變(實際上不可變)。
17.GC是什么?常用的兩種方法是什么?
GC是垃圾回收(是系統一個線程),Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法,系統並不保證會立即進行釋放內存。
System.gc()用來強制立即回收垃圾,即釋放內存。垃圾回收線程是另外一條線,它和主線程是並發的。
GC首先要判斷該對象是否是時候可以收集。兩種常用的方法是引用計數和對象引用遍歷。
18.線程常用的方法是什么?
Thread類的常用方法:
static Thread currentThread() //靜態方法,通過這個方法可以獲得主線程的引用,從而達到操作主線程的目的。
static int activeCount() //靜態方法,獲得當前活動線程數量
getId() //獲得當前線程id
String getName() //獲得當前線程名字
int getPriority() //獲得優先級
boolean isAlive() //當前線程是否處於活動狀態。
boolean isDaemon() //是否為守護線程
void run() //run()方法,我們用線程,主要就是對run()方法的重寫
void start() // 使該線程開始執行;Java 虛擬機調用該線程的run() 方法。
void sleep() //使當前線程休眠,以執行其他線程,如Thread.sleep(1000) 休眠1秒
19.Sleep()和wait()的區別?
sleep()方法:使線程停止一段時間的方法。在sleep 時間間隔期滿后,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)"醒來"的線程具有更高的優先級,(b)正在運行的線程因為其它原因而阻塞。
wait():是線程交互時,如果線程對一個同步對象x 發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被**喚醒**或**等待時間**到。
20.jsp和java的關系
JSP在運行時會被翻譯成servlet,而servlet是java代碼。
jsp頁面可以嵌入java代碼,但是一般很少這樣做。
21.Servlet的生命周期,比CGI有什么優點?
servlet是在服務器上運行的小程序。服務器端根據web.xml文件中的Servlet相關配置信息,將客戶端請求轉發到相應的Servlet引擎調用Service()方法,根據request對象中封裝的用戶請求與數據庫進行交互,返回數據之后,Servlet會將返回的數據封裝到response對象中;
servlet的生命周期
Servlet生命周期分為三個階段:
1,初始化階段 調用init()方法
2,響應客戶請求階段 調用service()方法
3,終止階段 調用destroy()方法
web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用 service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。
Servlet是Java平台上的CGI技術。Servlet在服務器端運行,動態地生成Web頁面。與傳統的CGI和許多其它類似CGI的技術相比,Java Servlet具有更高的效率並更容易使用。對於Servlet,重復的請求不會導致同一程序的多次轉載,它是依靠線程的方式來支持並發訪問的。
22.存儲過程和函數的區別?
函數有如:只能返回一個變量的限制。可以嵌入在sql中使用的,可以在select中調用,不能用臨時表,只能用表變量。
而存儲過程可以返回多個。存儲過程的限制相對就比較少。
23.java Web運行結構分析
java運行:通過javac命令編譯*.java得到class文件(字節碼文件,非dll,機器碼),用不同平台的JVM/JDK(JDK>JRE>JVM)來運行class文件。
Java Web運行:java框架,J2EE相應的支持包,Tomcat主要解析jsp文件,java文件通過jdk解析。
24.棧&隊列
棧:的應用場景:Servlet調用Service,再調用Dao。Dao執行完畢之后,彈棧,返回值給Service,Service執行完之后彈棧,返回給Servlet。
隊列:有兩個端口,先進先出
25.序列化的作用
存入session中,session會持久化到硬盤中,這個時候關閉服務器,重啟服務器session就會反序列化。
想實現session序列化,需要model類實現序列化接口Serializable,然后定義常量id。
26.線程狀態的使用
1. 時間片已到:創建--就緒--運行(運行不完)--就緒
2. 資源占用: 創建--就緒--運行(缺少資源)--等待(資源滿足)--就緒(當死鎖的時候,關閉一個等待)
(就緒就是線程的隊列,停止運行之后放在隊列的后面,后進后出)
當執行start()方法,表示線程就緒,根據隊列進行執行(並不一定立即運行,線程的啟動時重寫run方法,用start啟動,而不能直接用run啟動)
27.Servlet創建過程及生命周期
創建過程有三種方法:
1. 實現Servlet接口
2. 繼承GenericServlet類
3. 繼承HttpServlet方法
生命周期:
1. 初始化 執行init方法
2. 服務 執行service方法
3. 銷毀 執行destroy方法
28.什么時候用到過線程池
除了創建和銷毀線程的開銷之外,活動的線程也消耗系統資源(線程的生命周期!)
正確的使用方法是有一堆任務需要創建線程去執行,任務就是對象,在java里面,就好比是實現了Runnable接口的對象,那么此時就用線程池,如果緊緊就個吧兩個進程,那得了,還是沒必要,其實線程池,我看在效率上來講,就是降低了線程創建的時間消耗,實際上原理和創建單個的線程差不太多。
29.B/S架構:
C/S的優點是能充分發揮客戶端PC的處理能力,很多工作可以在客戶端處理后再提交給服務器。
**B/S(Browser/Server):**瀏覽器/服務器結構,界面顯示邏輯放在瀏覽器,事務處理邏輯則在Web Server。極少數的邏輯在前端實現,但主要的事務邏輯在服務器端實現。通常由Browser、Web Server、數據存儲Server形成三層架構。
31.Java反射機制
通過反射機制在運行時反編譯,判斷任意一個類所具有的成員變量和方法;
只需要在運行時才動態的創建和編譯,只需要在配置文件做簡單的修改。
32.jdbc的使用步驟:
1. 加載jar包
2. 建立連接Connection,傳url(數據庫的地址,端口為3306),用戶名,密碼
3. 創建Statement對象,sql語句就可以直接執行了
33.面向接口編程IOP
例如:我們存到mysql,但是要改存到oracle的時候,就需要改程序。
但是可以使用面向接口編程,從文件讀數據密碼。
面向接口,只關心功能,不關心實現。先寫出接口,然后其他人對接口功能進行實現。
在每一層上面再添加一層接口,然后對接口進行實現
34.對象的封裝
封裝是指按照信息屏蔽的原則,把對象的屬性和操作結合在一起,構成一個獨立的對象。
通過限制對屬性和操作的訪問權限,可以將屬性“隱藏”在對象內部,對外提供一定的接口,在對象之外只能通過接口對對象進行操作。
封裝性增加了對象的獨立性,從而保證了數據的可靠性。
外部對象不能直接操作對象的屬性,只能使用對象提供的服務。
35.單例模式的應用
比如說任務管理器,我們只能打開一個。數據庫連接池的設計一般也是采用單例模式,因為數據庫連接是一種數據庫資源。數據庫軟件系統中使用數據庫連接池,主要是節省打開或者關閉數據庫連接所引起的效率損耗,這種效率上的損耗還是非常昂貴的,用單例模式來維護,就可以大大降低這種損耗。
36.map的使用場景
當你覺得反復的for循環List查值麻煩時,你可以試着用map<key,value>存儲值,通過key來快速定位你要找的值
37.實現秒數和時間的轉化
System.out.println(date.getTime());可以將日期轉化為秒數
38.抽象類和接口的區別
接口是公開的,里面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是可以有私有方法或私有變量的,
另外,實現接口的一定要實現接口里定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,
一般的應用里,最頂級的是接口,然后是抽象類實現接口,最后才到具體類實現。
還有,接口可以實現多重繼承,而一個類只能繼承一個超類,但可以通過繼承多個接口實現多重繼承。
39.線程的使用
Java中實現多線程有兩種途徑:繼承Thread類或者實現Runnable接口。Runnable是接口,建議用接口的方式生成線程,因為接口可以實現多繼承,況且Runnable只有一個run方法,很適合繼承。在使用Thread的時候只需繼承Thread,並且new一個實例出來,調用start()方法即可以啟動一個線程。
Thread Test = new Thread();
Test.start();
40.為什么要使用索引
這是因為,創建索引可以大大提高系統的性能。
第一,通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
第二,可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
第四,在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
41.java中常用的類,包,接口
類:System類,Date類,Math類,Integer類,SimpleDateFormat類
包:java.lang包,java.io包,java.util包,java.swing包,java.net包,java.sql包
接口:Comparable,Collection,Map,List,Runnable
42.Error&Exception的區別
Error類和Exception類的父類都是throwable類,他們的區別是:
Error類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。對於這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。
Exception類表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該盡可能處理異常,使程序恢復運行,而不應該隨意終止異常。
Exception類又分為運行時異常(Runtime Exception)和受檢查的異常(Checked Exception ),運行時異常;ArithmaticException,IllegalArgumentException,編譯能通過,但是一運行就終止了,程序不會處理運行時異常,出現這類異常,程序會終止。而受檢查的異常,要么用try。。。catch捕獲,要么用throws字句聲明拋出,交給它的父類處理,否則編譯不會通過。
43.多線程的應用場景
后台任務:如定時向大量(100W以上)的用戶發送郵件;定期更新配置文件、任務調度(如quartz),一些監控用於定期信息采集。
最典型的應用比如tomcat,tomcat內部采用的就是多線程,上百個客戶端訪問同一個web應用,tomcat接入后都是把后續的處理扔給一個新的線程來處理,這個新的線程最后調用到我們的servlet程序,比如doGet或者doPost方法。
如果不采用多線程機制,上百個人同時訪問一個web應用的時候,tomcat就得排隊串行處理了,那樣客戶端根本是無法忍受那種訪問速度的。
2.數據庫
1.下列Select語句中,哪些子句不能包含子查詢
1.group by
張三 Java 90
張三 C# 98
李四 Java 89
李四 C# 62
李四 C++ 80
select sum(score) from Student group by course``則就是分別對各個課程求總和,就是
Java:98+89
C#:98+62
C++:80
select sum(score) from Student group by name 則是按人進行分組
張三:90+98
李四:89+62+80
2.order by
| Store_Name | Sales | Txn_Date |
| ------------- | ----- | ----------- |
| Los Angeles | 1500 | 05-Jan-1999 |
| San Diego | 250 | 07-Jan-1999 |
| San Francisco | 300 | 08-Jan-1999 |
| Boston | 700 | 08-Jan-1999 |
我們就打入:
``SELECT Store_Name, Sales, Txn_Date FROM Store_Information ORDER BY Sales DESC;``
結果:
```
Los Angeles 1500 Jan-05-1999
Boston 700 Jan-08-1999
San Francisco 300 Jan-08-1999
San Diego 250 Jan-07-1999
```
2.假設現在數據庫DB中有一個人員信息表(tUserInfo),表中包括 主鍵ID,姓名name,身份證號碼number等字段。由於程序的原因,后來發現表中有許多理論上重復的數據(即姓名name和身份證number相同的數據),現在要求根據身份證號碼和姓名去除表中的重復數據?請寫出具體sql語句。
select Max(ID) as Id,姓名,身份證號 from tUserInfo group by 姓名,身份證號;
這條Sql語句即可得到一份沒有重復姓名和身份證號的一組數據
獲得不重復的id
select Id from (select Max(ID) as Id,姓名,身份證號 from tUserInfo group by 姓名,身份證號) as t;
刪除掉重復的id即可
delete form user where id not in (select Id from (select Max(ID) as Id,姓名,身份證號 from tUserInfo group by 姓名,身份證號) as t );
3.已知數據表part:代碼(code),名稱(name),數量(num),請寫出如下sql命令:
1. 增加一條記錄,值為:code=‘001’,name=‘商品’,num=10
insert into part (code,name,num) values ('001','商品',10)
2. 刪除所有的num值為0的記錄
delete from part where num=0
3. 對num大於10的記錄,將其全部減1
update part set num=num+1 where num>10
4.已知數據表part:代碼(code),名稱(name),數量(num)3列,請編寫如下sql指令:
1. 刪除所有的num值為0,且name為null的記錄
delete from part where num=0 and name is null
2. 對num大於10且小於20的記錄,將其全部減1
update part set num=num-1 where num>10 and num<20
3. 編寫一條指令統計出num值< 10 , >=10 and < 20,>=20各有多少條記錄
select count(num) from part group by num where num < 10 union all select count(num) from part group by num where num >=10 union all select count(num) from part group by num where num < 20 union all select count(num) from part group by num where num >=20
5.MYSQL中外鍵on delete cascade有什么意義?
當在父表(即外鍵的來源表)中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則也刪除外鍵在子表(即包含外鍵的表)中的記錄。
6.主鍵和唯一索引的區別
(創建索引的方式:CREATE UNIQUE INDEX 索引名稱ON 表名稱 (列名稱))
創建索引可以大大提高系統的性能。
主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。
主鍵創建后一定包含一個唯一性索引,唯一性索引並不一定就是主鍵。
唯一性索引列允許空值,而主鍵列不允許為空值。
主鍵列在創建時,已經默認為空值 + 唯一索引了。
主鍵可以被其他表引用為外鍵,而唯一索引不能。
一個表最多只能創建一個主鍵,但可以創建多個唯一索引。
主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。
7.聚焦索引和非聚焦索引的區別
聚集索引存儲記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理存儲並不連續。就像字段,聚集索引是連續的,a后面肯定是b,非聚集索引就不連續了,就像圖書館的某個作者的書,有可能在第1個貨架上和第10個貨架上。還有一個小知識點就是:聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個。
8.約束有哪幾種?
1. 主鍵約束
保證實體的完整性,該列不會出現重復值,空值
2. 外鍵約束
保證引用的完整性
3. 檢查約束
保證域的完整性
4. 默認約束
保證域的完整性,至少給一個默認值
9.寫出常見的SQL關鍵字
SELECT --從數據庫表中檢索數據行和列
INSERT --向數據庫表添加新數據行
DELETE --從數據庫表中刪除數據行
UPDATE --更新數據庫表中的數據
10.數據庫相關
s_student表
id char 16 //id
s_no char 16 //學號
s_name varchar 32 //姓名
s_score
id char 8 //id
student_id char 17 //s_student的id
s_num varchar 16 //成績
#2.查詢學號為201420326的學生學號,姓名,成績
loading
#3.統計學號為201420326的學生總分
loading
#4.刪除所有的姓王學生的成績
loading
3.jsp
1.描述JSP MVC模式下重復提交問題產生的原因和解決方法
原因:
a>點擊提交按鈕兩次。
b>點擊刷新按鈕。
c>使用瀏覽器后退按鈕重復之前的操作,導致重復提交表單。
d>使用瀏覽器歷史記錄重復提交表單。
e>瀏覽器重復的HTTP請求。
但出現了這樣的問題並不見得就必須處理,要看你所開發的系統的類別而定。比如你接手的是某個資源管理系統,系統本身從需求的角度根本就不允許出現" 重復"的記錄,在這樣需求的約束條件下,去執行重復的提交動作只會引發“業務級異常”的產生(比如說抽獎,回退之后重新抽一次)
解決方法:
在服務器端生成一個令牌保存在用戶session中,在form中加一個hidden域,顯示該令牌的值,form提交后重新生成一個新的令牌,將用戶提交的令牌和session中的令牌比較,如相同則是重復提交。
2.簡述SERVLET API中forward()與redirect()的區別以及JSP中動態引入與靜態引入的區別
forward():僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址
redirect():則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。
所以,前者**更加高效**,在前者可以滿足需要時,盡量使用forward()方法,並且,這樣也有助於**隱藏實際的鏈接**。在有些情況下,比如,需要**跳轉到一個其它服務器上**的資源,則必須使用sendRedirect()方法。
靜態引入:就是把頁面A嵌入到頁面B中,如果頁面B中有JAVA代碼,比如說變量名是X,A中也有變量X這樣的話靜態引入會報錯,但是動態引入不會報錯,靜態引入的JSP編譯的時候會生成一個.java文件
動態引入:會生成兩個.java文件,因為動態引入(生成靜態頁面)是一個頁面引用另一個頁面而靜態的是嵌入。
不過 靜態引入和動態引入最后都只會生成一個html頁面。
3._描述Hibernate中的ID生成器_
1) assigned
主鍵由外部程序負責生成,無需Hibernate參與。
2) hilo
通過hi/lo 算法實現的主鍵生成機制,需要額外的數據庫表保存主鍵生成歷史狀態。
3) seqhilo
與hilo 類似,通過hi/lo 算法實現的主鍵生成機制,只是主鍵歷史狀態保存在Sequence中,適用於支持Sequence的數據庫,如Oracle。
4) increment
主鍵按數值順序遞增。此方式的實現機制為在當前應用實例中維持一個變量,以保存着當前的最大值,之后每次需要生成主鍵的時候將此值加1作為主鍵。
這種方式可能產生的問題是:如果當前有多個實例訪問同一個數據庫,那么由於各個實例各自維護主鍵狀態,不同實例可能生成同樣的主鍵,從而造成主鍵重復異常。因此,如果同一數據庫有多個實例訪問,此方式必須避免使用。
5) identity
采用數據庫提供的主鍵生成機制。如DB2、SQL Server、MySQL中的主鍵生成機制。
6) sequence
采用數據庫提供的sequence 機制生成主鍵。如Oralce 中的Sequence。
7) native
由Hibernate根據底層數據庫自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式。
8) uuid.hex
由Hibernate基於128 位唯一值產生算法生成16 進制數值(編碼后以長度32 的字符串表示)作為主鍵。
9) uuid.string
與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16)。在某些數據庫中可能出現問題(如PostgreSQL)。
10) foreign
使用外部表的字段作為主鍵。
4.描述Spring中的編程式事務處理及聲明式事務處理
Spring對編程式事務的支持
Spring中的事務分為物理事務和邏輯事務
物理事務:就是底層數據庫提供的事務支持,如JDBC或JTA提供的事務;
邏輯事務:是Spring管理的事務,不同於物理事務,邏輯事務提供更豐富的控制,而且如果想得到Spring事務管理的好處,必須使用邏輯事務,因此在Spring中如果沒特別強調一般就是邏輯事務;
邏輯事務解決方案:
低級別解決方案:
使用工具類獲取連接(會話)和釋放連接(會話),如使用org.springframework.jdbc.datasource包中的DataSourceUtils 類來獲取和釋放具有邏輯事務功能的連接。當然對集成第三方ORM框架也提供了類似的工具類,如對Hibernate提供了SessionFactoryUtils工具類,JPA的EntityManagerFactoryUtils等,
高級別解決方案:
使用Spring提供的模板類,如JdbcTemplate、HibernateTemplate和JpaTemplate模板類等,而這些模板類內部其實是使用了低級別解決方案中的工具類來管理連接或會話
Spring提供兩種編程式事務支持:直接使用PlatformTransactionManager實現和使用TransactionTemplate模板類,用於支持邏輯事務管理。如果采用編程式事務推薦使用TransactionTemplate模板類和高級別解決方案。
5.Http狀態碼
404:連接了,找不到資源
500:系統中解析出現錯誤
302:重定向狀態碼
200:順利,請求成功!
6.持久層框架比較
JDBC,JDBCTemplate,MyBatis,hibernate
1. jdbc:原生態的寫法,運行效率比較高,代碼量比較大,不支持數據庫跨平台(非常熟悉)
2. jdbcTemplate:spring提供的,支持aop,內嵌於spring,不支持數據庫跨平台
3. MyBatis:封裝得更好,性能不會差太多,復雜SQL構建,支持aop事務,支持緩存,不支持數據庫跨平台
4. hibernate:在損害性能的基礎之上實現數據庫的跨平台移植,hql查詢語句
7.SSH框架
struts2+spring+hibernate
對象的調用流程是: jsp-> Action - > Service ->DAO ->Hibernate 。
#1.Struts 的MVC設計模式
struts的重要功能,提供struts的過濾器,攔截用戶的請求,查找struts配置文件,為其匹配一個對應的Action,這個Action負責調用模型,獲得數據,然后對數據做部分處理,接着Action再將處理后的數據,為其選擇一個視圖進行輸出。
#2.Spring 的IOC和AOP可以使我們的項目在最大限度上解藕。
Spring的IoC(控制反轉) 、DI(依賴注入)這兩個概念:
Ioc:意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。(專門有容器來創建對象,IOC容器幫對象找相應的依賴對象並注入)
IoC(控制反轉),將類的創建和依賴關系寫在配置文件里,由配置文件注入,實現了松耦合
使用反射來讀取配置文件,類中提供setter,getter就可以。再在spring中配置就可以了,配置中還可以傳對象(裝配)。
DI注入:某個對象所需要的外部資源(包括對象、資源、常量數據),是同一個概念的不同角度描述,IOC容器配置所依賴的對象。
AOP(面向切面編程):
算是對OOP(引入封裝、繼承、多態)的補充和完善。OOP(面向對象編程)針對業務處理過程的**實體**及其**屬性**和**行為**進行**抽象封裝**,以獲得更加清晰高效的邏輯單元划分。
AOP則是針對業務處理過程中的**切面**進行提取,它所面對的是處理過程中的某個**步驟**或**階段**,以獲得邏輯過程中各部分之間低耦合性的**隔離效果**。
AOP 將安全,事務等於程序邏輯相對獨立的功能抽取出來,利用spring的配置文件將這些功能插進去,實現了按照方面編程,提高了復用性
如果幾個或更多個邏輯過程中,有重復的操作行為,AOP就可以提取出來,運用動態代理,實現程序功能的統一維護。
#3.Hibernate是對JDBC進一步封裝
在操作數據庫的時候,不需要再去和復雜SQL打交道,只要像操作對象一樣操作它就可以了(把關系數據庫的字段在內存中映射成對象的屬性)。Hibernate是一個沒有侵入性的框架,Hibernate不需要繼承任何類,不需要實現任何接口。這樣的對象叫POJO對象。
降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。緩存內的數據是對物理數據源中的數據的復制,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。
8.MVC模式的優點&作用
MVC模式的目的就是實現Web系統的職能分工。 Model層實現系統中的業務邏輯,通常可以用JavaBean或EJB來實現。 View層用於與用戶的交互,通常用JSP來實現。 Controller層是Model與View之間溝通的橋梁,它可以分派用戶的請求並選擇恰當的視圖以用於顯示,同時它也可以解釋用戶的輸入並將它們映射為模型層可執行的操作。
1. 各個模型層各司其職,互不干涉。
2. 有利於開發中的分工。
3. 有利於組件的重用。
9.jsp的九大內置對象
request內置對象
response內置對象
page內置對象
session內置對象
application內置對象
out內置對象
exception內置對象
config內置對象
pageContext內置對象
10.springMVC的介紹
常用注解: @Controller
在類或方法:@RequestMapping
springmvc主要使用的是注解配置,然后可以跟spring無縫配合,基於servlet
11.為什么使用mybatis
1. 數據庫沒有連接池,每次請求都會重新創建。
mybatis:使用線程池
2. sql語句是寫死在代碼中,不利於代碼維護。
mybatis:在xml中配置
3. preparedStatement 中的設置的參數也是寫的死,同樣不利於維護。
mybatis:在xml中配置
4. 數據從數據庫獲取后,讀取方式同樣是寫死的。
mybatis:自動映射。
