Java高頻面試題附帶答案

題目都來自網上收集,如果對你有用請點個關注支持一下,剛開博客有什麼不妥的可以留言討論,我也在準備秋招;

後續還會整理一些面經分享出來,一起加油!。

微信公衆號:Java成長錄

老鐵們可以關注下,書籍,知識點,視頻鏈接都會陸續更新,也是自己梳理學習的一個過程。


一、面試整體流程
1.1 簡單的自我介紹
我是 xxxx,工作 xxx 年.我先後在 xxxx 公司、yyyy 公司工作。先後做個 xxxx 項目、yyyy
項目。
1.2 你簡單介紹一下 xxxx 項目
爲了解決 xxxx 問題,開發了一套 xxxx 系統,該系統主要有那些部分組成。簡單介紹項
目的整體架構。參與某個模塊的開發。就要求你說一下這個模塊的業務及設計。
1.3 會問一下 JAVA 的專業技能
後面詳細講解
1.4 你還有什麼需要詢問我的嗎
公司要做的項目?項目中會使用一下什麼技術?
注意:經歷了多輪面試後,對於你的自我介紹和項目項目經驗面試官就不太關心了。
你說一下你最擅長的什麼?你簡單說一下?
最終技術面試完成後,都會讓你回家等消息,或者等 hr 來和你談薪資和福利。
二、java 的專業技能
2.1 java 的基礎部分
2.1.1 簡單講一下 java 的跨平臺原理
由於各操作系統(windows,liunx 等)支持的指令集,不是完全一致的。就會讓我們
的程序在不同的操作系統上要執行不同程序代碼。Java 開發了適用於不同操作系統及位數
的 java 虛擬機來屏蔽個系統之間的差異,提供統一的接口。對於我們 java 開發者而言,你
只需要在不同的系統上安裝對應的不同 java 虛擬機、這時你的 java 程序只要遵循 java 規範,
就可以在所有的操作系統上面運行 java 程序了。
Java 通過不同的系統、不同版本、不同位數的 java 虛擬機(jvm),來屏蔽不同的系統指令集差
異而對外體統統一的接口(java API),對於我們普通的 java 開發者而言,只需要按照接口開發
即可。如果我係統需要部署到不同的環境時,只需在系統上面按照對應版本的虛擬機即可。
2.2.2 搭建一個 java 開發環境的步驟
Java 開發環境需要些什麼?
1、適用於我們開發環境的 jdk
2、對應開發環境 eclipse
3、還需要 web 服務器(tomcat)
一、下載對應組件
二、安裝
Jdk,安裝正常流程安裝即可,配置我們的 JAVA_HOME,因爲後面的 eclispe 和 tomcat 會依
賴於這個變量.
Eclispe 正常解壓就 ok,設置 workspace 的默認編碼
Tomcat 正常解壓就 ok,把 tomcat 集成到 eclispe 中,安裝插件就 OK。
.......
Svn/git


2.1.3 講一下 java 中 int 數據佔幾個字節
Java 中有幾種基本數據類型?8 種
Int 佔 4 個字節,32 位
Boolean 1 位


2.1.4 面向對象的特徵有哪些方面
有四大基本特徵:封裝、抽象、繼承、多態
面向對象的封裝性,即將對象封裝成一個高度自治和相對封閉的個體,對象狀態(屬性)由
這個對象自己的行爲(方法)來讀取和改變。
張三這個人,他的姓名等屬性,要有自己提供的獲取或改變的方法來操作。private name setName
getName
抽象就是找出一些事物的相似和共性之處,然後將這些事物歸爲一個類,這個類只考慮這些
事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目
標有關的方面。 就是把現實生活中的對象,抽象爲類。
在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的
類所定義的內容作爲自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的
需要,這就是繼承。遺產繼承
多態是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時
並不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變
量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。
Object obj = new xxx();
UserDao userDao = new UserDaoJdbcImpl();
UserDao userDao = new UserDaoHibernateImpl();
靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法
在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個
對象的方法,而不是引用變量的類型中定義的方法。
原則:回答比較抽象問題的時候,要舉例說明


2.1.5 有了基本數據類型,爲什麼還需要包裝類型?
基本數據類型,java 中提供了 8 中基本的數據類型。boolean int float 等
包裝類型:每一個基本的數據類型都會一一對應一個包裝類型。
boolean ----->Boolean
Int -------->Integer
裝箱和拆箱
裝箱:把基本的數據類型轉換成對應的包裝類型.
Integer .valueOf(1)
Integer i = 1;自動裝箱,實際上在編譯時會調用 Integer .valueOf 方法來裝箱
拆箱:就是把包裝類型轉換爲基本數據類型.基本數據類型 名稱 = 對應的包裝類型。
Integer i = 1;
int j = i;//自動拆箱//int j = i=intValue();手動拆箱
自動拆箱:實際上會在編譯調用 intValue
Java 是一個面向對象的語言,而基本的數據類型,不具備面向對象的特性。
null Integer--->null int---->0 用 Integer 和 int 分別表示 Person 這個類的 ID
Max 最大值
min 最小值
緩存值:對象緩存,Integer i=1; integer j= 1;i ==j


2.1.6、說一下"=="和 equals 方法究竟有什麼區別?
非常經典的一個面試題?先說清楚一個,再來說另一個?
==用來判斷兩個變量之間的的值是否相等。變量就可以分爲基本數據類型變量,引用類型。
如果是基本數據類型的變量直接比較值而引用類型要比較對應的引用的內存的首地址。
equals 用來比較兩個對象長得是否一樣。判斷兩個對象的某些特徵是否一樣。實際上就是
調用對象的 equals 方法進行比較。


2.1.7 講 一 下 String 和 StringBuilder 的 區 別 (fnal) ?
StringBuffer 和 StringBuilder 的區別?
1.在 java 中提供三個類 String StringBuillder StringBuffer 來表示和操作字符串。字符串就是多
個字符的集合。
String 是內容不可變的字符串。String 底層使用了一個不可變的字符數組(fnal char[])
String str =new String(“bbbb”);
而 StringBuillder StringBuffer,是內容可以改變的字符串。StringBuillder StringBuffer 底層使用
的可變的字符數組(沒有使用 fnal 來修飾)
2.最經典就是拼接字符串。
1、String 進行拼接.String c = “a”+”b”;
2、StringBuilder 或者 StringBuffer
StringBuilder sb = new StringBuilder(); sb.apend(“a”).apend(“b”)
拼接字符串不能使用 String 進行拼接,要使用 StringBuilder 或者 StringBuffer
3.StringBuilder 是線程不安全的,效率較高.而 StringBuffer 是線程安全的,效率較低。


2.1.8、講一下 java 中的集合?
Java 中的集合分爲 value,key--vale(Conllecton Map)兩種。
存儲值有分爲 List 和 Set.
List 是有序的,可以重複的。
Set 是無序的,不可以重複的。根據 equals 和 hashcode 判斷,也就是如果
一個對象要存儲在 Set 中,必須重寫 equals 和 hashCode 方法。
存儲 key-value 的爲 map.
8、ArrayList 和 LinkedList 的區別?
List 常用的 ArrayList 和 LinkedList。區別和使用場景?
ArrayList 底層使用時數組。LinkedList 使用的是鏈表。
數組查詢具有所有查詢特定元素比較快。而插入和刪除和修改比較慢(數組在內存中是一
塊連續的內存,如果插入或刪除是需要移動內存)。
鏈表不要求內存是連續的,在當前元素中存放下一個或上一個元素的地址。查詢時需要
從頭部開始,一個一個的找。所以查詢效率低。插入時不需要移動內存,只需改變引用指
向即可。所以插入或者刪除的效率高。
ArrayList 使用在查詢比較多,但是插入和刪除比較少的情況,而 LinkedList 使用在查詢比較
少而插入和刪除比較多的情況。


2.1.9 講 一 下 HashMap 哈 HashTable 的 區 別 ?HashTable 和
ConcurrentHashMap 的區別?
相同點:HashMap 和 HasheTalbe 都可以使用來存儲 key--value 的數據。
區別:
1、HashMap 是可以把 null 作爲 key 或者 value 的,而 HashTable 是不可以的。
2、HashMap 是線程不安全的,效率較高。而 HashTalbe 是線程安全的,效率較低。
?我想線程安全但是我又想效率高?
通過把整個 Map 分爲 N 個 Segment(類似 HashTable),可以提供相同的線程安全,但是效
率提升 N 倍,默認提升 16 倍。


2.1.10、實現一個拷貝文件的工具類使用字節流還是字
符流?
我們拷貝的文件不確定是隻包含字符流,有可以能有字節流(圖片、聲音、圖像等),爲考
慮到通用性,要使用字節流。


2.1.11、講一下線程的幾種實現方式?啓動方式?區分方
式?
①實現方式
1、通過繼承 Thread 類實現一個線程
2、通過實現 Runnable 接口實現一個線程
繼承擴展性不強,java 總只支持單繼承,如果一個類繼承 Thread 就不能繼承其他的類
了。
②怎麼啓動?
Thread thread = new Thread(繼承了 Thread 的對象/實現了 Runnable 的對象)
thread.setName(“設置一個線程名稱”);
thread.start();
啓動線程使用 start 方法,而啓動了以後執行的是 run 方法。
③怎麼區分線程?在一個系統中有很多線程,每個線程都會打印日誌,我想區分是哪個線
程打印的怎麼辦?
thread.setName(“設置一個線程名稱”); 這是一種規範,在創建線程完成後,都需要設
置名稱。


2.1.12 有沒有使用過線程併發庫?
簡單瞭解過?
JDK5 中增加了 Doug Lea 的併發庫,這一引進給 Java 線程的管理和使用提供了強大的便利性。
java.utl.current 包中提供了對線程優化、管理的各項操作,使得線程的使用變得的心應手。
該包提供了線程的運行,線程池的創建,線程生命週期的控制.
Java 通過 Executors 提供四個靜態方法創建四種線程池,分別爲:
newCachedThreadPool 創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活
回收空閒線程,若無可回收,則新建線程。
newFixedThreadPool 創建一個定長線程池,可控制線程最大併發數,超出的線程會在
隊列中等待。
newScheduledThreadPool 創建一個定長線程池,支持定時及週期性任務執行。
newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執
行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行


2.1.13 線程池的作用?
1、限定線程的個數,不會導致由於線程過多導致系統運行緩慢或崩潰
2、線程池不需要每次都去創建或銷燬,節約了資源、
3、線程池不需要每次都去創建,響應時間更快。
連接池也是一樣?


2.1.14 講一下什麼是設計模式?常用的設計模式有哪些?
設計模式就是經過前人無數次的實踐總結出的,設計過程中可以反覆使用的、可以解決特
定問題的設計方法。
單例(飽漢模式、飢漢模式)
1、構造方法私有化,讓出了自己類中能創建外其他地方都不能創建
2、在自己的類中創建一個單實例(飽漢模式是一出來就創建創建單實例,而飢漢模式需要
的時候才創建)
3、提供一個方法獲取該實例對象(創建時需要進行方法同步)
工廠模式:Spring IOC 就是使用了工廠模式.
對象的創建交給一個工廠去創建。
代理模式:Spring AOP 就是使用的動態代理。

 


2.2 java web 部分


2.2.1 講一下 htp get 和 post 請求的區別?
GET 和 POST 請求都是 http 的請求方式,用戶通過不同的 http 的請求方式完成
對資源(url)的不同操作。GET,POST,PUT,DELETE 就對應着對這個資源的
查 ,改 ,增 ,刪 4 個操作,具體點來講 GET 一般用於獲取/查詢資源信息,而
POST 一般用於更新資源信息
1、Get 請求提交的數據會在地址欄顯示出來,而 post 請求不會再地址欄顯示出
來.
GET 提交,請求的數據會附在 URL 之後(就是把數據放置在 HTTP 協議頭中),
以?分割 URL 和傳輸數據,多個參數用&連接;POST 提交:把提交的數據放置在
是 HTTP 包的包體中。 因此,GET 提交的數據會在地址欄中顯示出來,而 POST
提交,地址欄不會改變
2、傳輸數據的大小
http Get 請求由於瀏覽器對地址長度的限制而導致傳輸的數據有限制。而 POST
請求不會因爲地址長度限制而導致傳輸數據限制。
3、安全性,POST 的安全性要比 GET 的安全性高。由於數據是會在地址中呈現,
所以可以通過歷史記錄找到密碼等關鍵信息。
2.2.2 說一下你對 servlet 的理解?或者 servlet 是什麼?
Servlet(Server Applet),全稱 Java Servlet, 是用 Java 編寫的服務
器端程序。而這些 Sevlet 都要實現 Servlet 這個藉口。其主要功能在於交互式
地瀏覽和修改數據,生成動態 Web 內容。Servlet 運行於支持 Java 的應用服務
器中。
HttpServlet 重寫 doGet 和 doPost 方法或者你也可以重寫 service 方法完成對
get 和 post 請求的響應


2.2.3 簡單說一下 servlet 的生命週期?
servlet 有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這
個生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表達。
加載 Servlet 的 class---->實例化 Servlet----->調用 Servlet 的 init 完成初始化 ---->響應請求
(Servlet 的 service 方法)----->Servlet 容器關閉時(Servlet 的 destory 方法)
Servlet 啓動時,開始加載 servlet 生命週期開始。Servlet 被服務器實例化後,容器運行其
init 方法,請求到達時運行其 service 方法,service 方法自動派遣運行與請求對應的 doXXX
方法(doGet,doPost)等,當服務器決定將實例銷燬的時候(服務器關閉)調用其 destroy 方
法。
2.2.4 Servlet API 中 forward() 與 redirect()的區別?
1、forward 是服務器端的轉向而 redirect 是客戶端的跳轉。
2、使用 forward 瀏覽器的地址不會發生改變。而 redirect 會發生改變。
3、Forward 是一次請求中完成。而 redirect 是重新發起請求。
4、Forward 是在服務器端完成,而不用客戶端重新發起請求,效率較高。


2.2.5 JSP 和 Servlet 有哪些相同點和不同點?
JSP 是 Servlet 技術的擴展,所有的 jsp 文件都會被翻譯爲一個繼承 HtpServlet 的類。也就是
jsp 最終也是一個 Servlet.這個 Servlet 對外提供服務。
Servlet 和 JSP 最主要的不同點在於 JSP 側重於視圖,Servlet 主要用於控制邏輯。
Servlet 如果要實現 html 的功能,必須使用 Writer 輸出對應的 html,比較麻煩。而 JSP 的情況
是 Java 和 HTML 可以組合成一個擴展名爲.jsp 的文件,做界面展示比較方便而嵌入邏輯比較
複雜。


2.2.6 jsp 有哪些內置對象?作用分別是什麼?
9 個內置的對象:
request 用戶端請求,此請求會包含來自 GET/POST 請求的參數
response 網頁傳回用戶端的迴應
pageContext 網頁的屬性是在這裏管理
session 與請求有關的會話期
applicaton servlet 正在執行的內容
out 用來傳送回應的輸出
confg servlet 的構架部件
page JSP 網頁本身
excepton 針對錯誤網頁,未捕捉的例外
四大作用域:pageContext request session applicaton 可以通過 jstl 從四大作用域中取值.
Jsp 傳遞值 request session applicaton cookie 也能傳值


2.2.7 說一下 session 和 cookie 的區別?你在項目中都有
哪些地方使用了?
Session 和 cookie 都是會話(Seesion)跟蹤技術。Cookie 通過在客戶端記錄信
息確定用戶身份,Session 通過在服務器端記錄信息確定用戶身份。 但是
Session 的實現依賴於 Cookie,sessionId(session 的唯一標識需要存放在客戶
端).
cookie 和 session 的區別:
1、cookie 數據存放在客戶的瀏覽器上,session 數據放在服務器上。
2、cookie 不是很安全,別人可以分析存放在本地的 COOKIE 並進行 COOKIE 欺騙
考慮到安全應當使用 session。
3、session 會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務
器的性能,考慮到減輕服務器性能方面,應當使用 COOKIE。
4、單個 cookie 保存的數據不能超過 4K,很多瀏覽器都限制一個站點最多保存
20 個 cookie。
5、所以個人建議:
將登陸信息等重要信息存放爲 SESSION
其他信息如果需要保留,可以放在 COOKIE 中,比如購物車
購物車最好使用 cookie,但是 cookie 是可以在客戶端禁用的,這時候我們要使
用 cookie+數據庫的方式實現,當從 cookie 中不能取出數據時,就從數據庫獲取。
2.2.8、MVC 的各個部分都有那些技術來實現?
M(Model) 模型 javabean
V(View) 視圖 html jsp volicity freemaker
C(Control) 控制器 Servlet,Acton
Jsp+Servlet+javabean 最經典 mvc 模式,實際上就是 model2 的實現方式,就是把視圖和邏輯
隔離開來
Model1 的方式 jsp+service+dao
MOdel2 的方式 jsp+servlet+service+dao
使用 struts2 和 springmvc 這樣的 mvc 框架後,jsp+核心控制器+acton+javabean


2.3 數據庫部分


2.3.1 數據庫的分類及常用的數據庫
數據庫分爲:關係型數據庫和非關係型數據庫
關係型:mysql oracle sqlserver 等
非關係型:redis,memcache,mogodb,hadoop 等
2.3.2 簡單介紹一下關係數據庫三範式?
範式就是規範,就是關係型數據庫在設計表時,要遵循的三個規範。
要想滿足第二範式必須先滿足第一範式,要滿足第三範式必須先滿足第二範式。
第一範式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一
列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。
列數據的不可分割
二範式(2NF)要求數據庫表中的每個行必須可以被唯一地區分。爲實現區
分通常需要爲表加上一個列,以存儲各個實例的唯一標識。(主鍵)
滿足第三範式(3NF)必須先滿足第二範式(2NF)。簡而言之,第三範式
(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。
(外鍵)
反三範式,有的時候爲了效率,可以設置重複或者可以推導出的字段.
訂單(總價)和訂單項(單價)
2.3.3 事務四個基本特徵或 ACID 特性。
事務是併發控制的單位,是用戶定義的一個操作序列。這些操作要麼都做,
要麼都不做,是一個不可分割的工作單位。
一個轉賬必須 A 賬號扣錢成功,B 賬號加錢成功,纔算正真的轉賬成功。
事務必須滿足四大特徵:原子性,一致性,隔離性持久性/持續性
原子性:表示事務內操作不可分割。要麼都成功、要麼都是失敗.
一致性:要麼都成功、要麼都是失敗.後面的失敗了要對前面的操作進行回滾。
隔離性:一個事務開始後,不能後其他事務干擾。
持久性/持續性:表示事務開始了,就不能終止。


2.3.4 mysql 數據庫的默認的最大連接數?
100
爲什麼需要最大連接數?特定服務器上面的數據庫只能支持一定數目同時連接,這時候我
們一般都會設置最大連接數(最多同時服務多少連接)。在數據庫安裝時都會有一個默認
的最大連接數爲 100
2.3.5 說一下 msyql 的分頁?Oracle 的分頁?
爲什麼需要分頁?在很多數據是,不可能完全顯示數據。進行分段顯示.
Mysql 是使用關鍵字 limit 來進行分頁的 limit offset,size 表示從多少索引去多少位.
Oracle 的分頁,大部分情況下,我們是記不住了。說思路,要使用三層嵌套查詢。
Oracle 的分頁有點兒記不住了,只記得一些大概。是使用了三層嵌套查詢。如果在工作
中使用了,可以到原來的項目中拷貝或上網查詢。
mysql:
String sql =
"select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;
oracle:
String sql =
"select * from " +
(select *,rownum rid from (select * from students order by postme desc) where rid<=" +
pagesize*pagenumber + ") as t" +
"where t>" + pageSize*(pageNumber-1);


2.3.6 簡單講一下數據庫的觸發器的使用場景?
觸發器,需要有觸發條件,當條件滿足以後做什麼操作。
觸發器用處還是很多的,比如校內網、開心網、Facebook,你發一個日誌,自動通知好友,
其實就是在增加日誌時做一個後觸發,再向通知表中寫入條目。因爲觸發器效率高。而
UCH 沒有用觸發器,效率和數據處理能力都很低。
每插入一個帖子,都希望將版面表中的最後發帖時間,帖子總數字段進行同步更新,用觸
發器做效率就很高。
create table board1(id int primary key auto_increment,name varchar(50),ar
tcleCount int);
create table artcle1(id int primary key auto_increment,ttle varchar(50)
,bid int references board1(id));
delimiter |#把分割符;改成|
create trigger insertArtcle_Trigger afer insert on artcle1 for each ro
w begin
-> update board1 set artcleCount=artcleCount+1 where id= NEW.bid;
-> end;
-> |
delimiter ;
insert into board1 value (null,'test',0);
insert into artcle1 value(null,'test',1);


2.3.7 簡單講一下數據庫的存儲過程的使用場景?
數據庫存儲過程具有如下優點:
1、存儲過程只在創建時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般
SQL 語句每執行一次就編譯一次,因此使用存儲過程可以大大提高數據庫執行速度。
2、通常,複雜的業務邏輯需要多條 SQL 語句。這些語句要分別地從客戶機發送到服務器,
當客戶機和服務器之間的操作很多時,將產生大量的網絡傳輸。如果將這些操作放在一個
存儲過程中,那麼客戶機和服務器之間的網絡傳輸就會大大減少,降低了網絡負載。
3、存儲過程創建一次便可以重複使用,從而可以減少數據庫開發人員的工作量。
4、安全性高,存儲過程可以屏蔽對底層數據庫對象的直接訪問,使用 EXECUTE 權限調用
存儲過程,無需擁有訪問底層數據庫對象的顯式權限。
正是由於存儲過程的上述優點,目前常用的數據庫都支持存儲過程,例如 IBM
DB2,Microsoft SQL Server,Oracle,Access 等,開源數據庫系統 MySQL 也在
5.0 的時候實現了對存儲過程的支持。

定義存儲過程 :
create procedure insert_Student (_name varchar(50),_age int ,out _id int)
begin
insert into student value(null,_name,_age);
select max(stuId) into _id from student;
end;
call insert_Student('wfz',23,@id);
select @id;

2.3.8 用 jdbc 怎麼調用存儲過程?
賈璉欲執事
加載驅動
獲取連接
設置參數
執行
釋放連接
package com.huawei.interview.lym;
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 Auto-generated method stub
Connection cn = null;
CallableStatement cstmt = null;
try {
//這裏最好不要這麼幹,因爲驅動名寫死在程序中了
Class.forName("com.mysql.jdbc.Driver");
//實際項目中,這裏應用 DataSource 數據,如果用框架,
//這個數據源不需要我們編碼創建,我們只需 Datasource ds =
context.lookup()
//cn = ds.getConnection();
cn =
DriverManager.getConnection("jdbc:mysql:///test","root","root");
cstmt = cn.prepareCall("{call insert_Student(?,?,?)}");
cstmt.registerOutParameter(3,Types.INTEGER);
cstmt.setString(1, "wangwu");
cstmt.setInt(2, 25);
cstmt.execute();
//get 第幾個,不同的數據庫不一樣,建議不寫
System.out.println(cstmt.getString(3));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
/*try{cstmt.close();}catch(Exception e){}
try{cn.close();}catch(Exception e){}*/
try {
if(cstmt != null)
cstmt.close();
if(cn != null)
cn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.3.9 常用 SQL

2.3.10 簡單說一下你對 jdbc 的理解?
Java database connecton java 數據庫連接.數據庫管理系統(mysql oracle 等)是很多,每個數據
庫管理系統支持的命令是不一樣的。
Java 只定義接口,讓數據庫廠商自己實現接口,對於我們者而言。只需要導入對應廠商開
發的實現即可。然後以接口方式進行調用.(mysql + mysql 驅動(實現)+jdbc)
2.3.11 寫一個簡單的 jdbc 的程序。寫一個訪問 oracle 數
據的 jdbc 程序?
賈璉欲執事
加載驅動(com.mysql.jdbc.Driver,oracle.jdbc.driver.OracleDriver)
獲取連接(DriverManager.getConnecton(url,usernam,passord))
設置參數 Statement PreparedStatement
cstmt.setXXX(index, value);
執行 executeQuery executeUpdate
釋放連接(是否連接要從小到大,必須放到 fnnaly)
2.3.12 JDBC 中的 PreparedStatement 相比 Statement 的好處
大多數我們都使用 PreparedStatement 代替 Statement
1:PreparedStatement 是預編譯的,比 Statement 速度快
2:代碼的可讀性和可維護性
雖然用 PreparedStatement 來代替 Statement 會使代碼多出幾行,但這樣的代碼無論從
可讀性還是可維護性上來說.都比直接用 Statement 的代碼高很多檔次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values
('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4)
values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
不用我多說,對於第一種方法,別說其他人去讀你的代碼,就是你自己過一段時間再去讀,
都會覺得傷心。
3:安全性
PreparedStatement 可以防止 SQL 注入攻擊,而 Statement 卻不能。比如說:
String sql = "select * from tb_name where name= '"+varname+"' and
passwd='"+varpasswd+"'";
如果我們把[' or '1' = '1]作爲 varpasswd 傳入進來.用戶名隨意,看看會成爲什麼?
select * from tb_name = '隨意' and passwd = '' or '1' = '1';
因爲'1'='1'肯定成立,所以可以任何通過驗證,更有甚者:
把[';drop table tb_name;]作爲 varpasswd 傳入進來,則:
select * from tb_name = '隨意' and passwd = '';drop table tb_name;有些數據
庫是不會讓你成功的,但也有很多數據庫就可以使這些語句得到執行。
而如果你使用預編譯語句你傳入的任何內容就不會和原來的語句發生任何匹配的關係,只
要全使用預編譯語句你就用不着對傳入的數據做任何過慮。而如果使用普通的
statement,有可能要對 drop 等做費盡心機的判斷和過慮。
2.3.13 數據庫連接池作用
1、限定數據庫的個數,不會導致由於數據庫連接過多導致系統運行緩慢或崩潰
2、數據庫連接不需要每次都去創建或銷燬,節約了資源
3、數據庫連接不需要每次都去創建,響應時間更快。


2.4 前端部分


2.4.1 簡單說一下 html,css,javascript 在網頁開發中的定位?
HTML 超文本標記語言 定義網頁的結構
CSS 層疊樣式表,用來美化頁面
JavaScript 主要用來驗證表單,做動態交互(其中 ajax)
2.4.2 簡單介紹一下 Ajax?
什麼是 Ajax? 異步的 javascript 和 xml
作用是什麼?通過 AJAX 與服務器進行數據交換,AJAX 可以使網頁實現佈局更新。
這意味着可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。
怎麼來實現 Ajax XmlHtpRequest 對象,使用這個對象可以異步向服務器發送請求,獲取
獲取響應,完成局部更新。Open send responseText/responseXML 局部響應.
使用場景 登陸失敗時不跳轉頁面,註冊時提示用戶名是否存在,二級聯動等等使用場景
2.4.3 js 和 jQuery 的關係?
jQuery 是一個 js 框架,封裝了 js 的屬性和方法。讓用戶使用起來更加便利。
,並且增強了 js 的功能.
使用原生 js 是要處理很多兼容性的問題(註冊事件等),由 jQuery 封裝了底層,就不用處理
兼容性問題。
原生的 js 的 dom 和事件綁定和 Ajax 等操作非常麻煩,jQuery 封裝以後操作非常方便。
2.4.4 jQuery 的常用選擇器?
ID 選擇器 通過 ID 獲取一個元素
Class 選擇器 通過類(css)獲取元素
標籤選擇器 通過標籤獲取元素
通用選擇器(*) 獲取所以的元素
div.myCls 獲取有 myCls 這個類的 div
層次選擇器
兒子選擇器 > 獲取下面的子元素
後代選擇器 空格 獲取下面後代,包括兒子、孫子等後代
屬性選擇器
Tag[atrName=’test’] 獲取有屬性名爲 xxxx 並且屬性的值爲 test 的所有 xxx 標籤
<input type=”checkbox” name=”hobby”/> 喫飯<br/>
<input type=”checkbox” name=”hobby”/> 睡覺<br/>
Input[name=’hobby’],表示獲取屬性名爲 name 並且 name 屬性值爲 hobby 的的所有
input 標籤元素
2.4.5 jQuery 的頁面加載完畢事件?
很多時候我們需要獲取元素,但是必須等到該元素被加載完成後才能獲取。我們可以
把 js 代碼放到該元素的後面,但是這樣就會造成 js 在我們的 body 中存在不好管理。所有頁
面加載完畢後所有的元素當然已經加載完畢。一般獲取元素做操作都要在頁面加載完畢後
操作。

第一種:
$(document).ready(functon(){
});
$(document)把原生的 document 這個 dom 對
象轉換爲 jQuery 對象,轉換完成後才能調用
ready 方法
ready(fn),表示的是頁面結構被加載完畢後執
行傳入函數 fn
第二種:
$(functon(){
});
當頁面加載完畢後執行裏面的函數,這一種
相對簡單,用得最多。
window.onload 的區別
1、jQuery 中的頁面加載完畢事件,表示的是頁面結構被加載完畢。
2、window.onload 表示的是頁面被加載完畢。
<img src=”http://baidu.com/1.jpg”/> onload 必須等等頁面中的圖片、聲音、圖像等遠程
資源被加載完畢後才調用而 jQuery 中只需要頁面結構被加載完畢。

2.4.6 Jquery 的 Ajax 和原生 Js 實現 Ajax 有什麼關係?
jQuery 中的 Ajax 也是通過原生的 js 封裝的。封裝完成後讓我們使用起來更加便利,不用考
慮底層實現或兼容性等處理。
如果採用原生 js 實現 Ajax 是非常麻煩的,並且每次都是一樣的。如果我們不使用 jQuery 我
們也要封裝 Ajax 對象的方法和屬性。有像 jQuery 這些已經封裝完成,並經過很多企業實際
的框架,比較可靠並且開源。我們就不需要封裝,直接使用成熟的框架(jQuery)即可.
2.4.7 簡單說一下 html5?你對現在的那些新技術有了解?
Html5 是最新版本的 html,是在原來 html4 的基礎上增強了一些標籤。
Html 增加一些像畫板、聲音、視頻、web 存儲等高級功能。但是 html5 有一個不好的地方,
那就是 html5 太強調語義了,導致開發中都不知道要選擇那個標籤。
在做頁面佈局是,無論頭部、主題、導航等模塊都使用 div 來表示,但是 html5 的規範,
需要使用不同的標籤來表示。(header footer 等)
你對現在的那些新技術有了解
Html5 css3 等
2.4.8 簡單說一下 css3?
Css3 是最新版本的 css,是對原理 css2 的功能增強。
Css3 中提供一些原來 css2 中實現起來比較困難或者不能實現的功能。
1、盒子圓角邊框
2、盒子和文字的陰影
3、漸變
4、轉換 移動、縮放、旋轉等
5、過渡、動畫都可以使用動畫。
6、可以使用媒體查詢實現響應式網站。
Css3 最大缺點就是要根據不同的瀏覽器處理兼容性。對應有一些處理兼容性的工具。不
用擔心.
2.4.9 bootstrap 是什麼?
BootStrap 是一個移動設備優先的 UI 框架。我們可以不用謝任何 css,js 代碼就能實現比較漂
亮的有交互性的頁面。我們程序員對頁面的編寫是有硬傷的,所有要自己寫頁面的話就要
使用類似於 bootstrap 這樣的 UI 框架。
平時用得很多的:
1、模態框
2、表單,表單項
3、佈局
4、刪格系統


2.5 框架部分


2.5.1 什麼是框架?
框架(Framework)是一個框子——指其約束性,也是一個架子——指其支撐性。
IT 語境中的框架,特指爲解決一個開放性問題而設計的具有一定約束性的支撐結構。在
此結構上可以根據具體問題擴展、安插更多的組成部分,從而更迅速和方便地構建完整的
解決問題的方案。
1)框架本身一般不完整到可以解決特定問題,但是可以幫助您快速解決特定問題;
沒有框架所有的工作都從零開始做,有了框架,爲我們提供了一定的功能,我們就可以在框
架的基礎上開發,極大的解放了生產力。
不同的框架,是爲了解決不同領域的問題。一定要爲了解決問題纔去學習框架。
2)框架天生就是爲擴展而設計的;
3)框架裏面可以爲後續擴展的組件提供很多輔助性、支撐性的方便易用的實用工具
(utlites),也就是說框架時常配套了一些幫助解決某類問題的庫(libraries)或工具
(tools)。
java 中就是一系列的 jar 包,其本質就是對 jdk 功能的擴展.
2.5.2 MVC 模式
MVC 全名是 Model View Controller,是模型(model)-視圖(view)-控制器(controller)
的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將
業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新
編寫業務邏輯。
最簡單的、最經典就是 Jsp(view) +Servlet(controller) + JavaBean(model)
1、當控制器收到來自用戶的請求
2、控制器調用 JavaBean 完成業務
3、完成業務後通過控制器跳轉 JSP 頁面的方式給用戶反饋信息
4、Jsp 個 用戶做出響應。
控制器都是核心
2.5.3 MVC 框架
什麼是 MVC 框架?
是爲了解決傳統 MVC 模式(Jsp + Servlet + JavaBean)的一些問題而出現的框架。
傳統 MVC 模式問題
1、所有的 Servlet 和 Servlet 映射都要配置在 web.xml 中,如果項目太大,web.xml 就太
龐大,並且不能實現模塊化管理。
2、Servlet 的主要功能就是接受參數、調用邏輯、跳轉頁面,比如像其他字符編碼、文
件上傳等功能也要寫在 Servlet 中,不能讓 Servlet 主要功能而需要做處理一下特例。
3 、 接 受 參 數 比 較 麻 煩 (String name = request.getParameter(“name”),User user=new User
user.setName(name)),不能通過 model 接收,只能單個接收,接收完成後轉換封裝 model.
4、跳轉頁面方式比較單一(forword,redirect),並且當我的頁面名稱發生改變時需要修改
Servlet 源代碼.
現在比較常用的 MVC 框架有:
struts
webwork
Struts2
Spring MVC
2.5.4 簡單講一下 struts2 的執行流程?
Struts2 的原理?
一個請求在 Struts2 框架中的處理大概分爲以下幾個步驟:
1、客戶端瀏覽器發送請求
2 、 這 個 請 求 經 過 一 系 列 的 過 濾 器 ( Filter ) ( 這 些 過 濾 器 中 有 一 個 叫 做
ActonContextCleanUp 的可選過濾器,這個過濾器對於 Struts2 和其他框架的集成很有幫助,
例如:SiteMesh Plugin);
3、接着 FilterDispatcher(StrutsPrepareAndExecuteFilter)被調用,FilterDispatcher
(StrutsPrepareAndExecuteFilter) 詢 問 ActonMapper 來 決 定 這 個 請 求 是 否 需 要 調 用 某 個
Acton;
4、如果 ActonMapper 決定需要調用某個 Acton,FilterDispatcher
(StrutsPrepareAndExecuteFilter)把請求的處理交給 ActonProxy;
5、ActonProxy 通過 Confguraton Manager 詢問框架的配置文件,找到需要調用的 Acton 類;
6、ActonProxy 創建一個 ActonInvocaton 的實例。
7、ActonInvocaton 實例使用命名模式來調用,在調用 Acton 的過程前後,涉及到相關攔截
器(Intercepter)的調用。
8、一旦 Acton 執行完畢,ActonInvocaton 負責根據 struts.xml 中的配置找到對應的返回結
果。返回結果通常是(但不總是,也可能是另外的一個 Acton 鏈)一個需要被表示的 JSP
或者 FreeMarker 的模版。在表示的過程中可以使用 Struts2 框架中繼承的標籤。在這個過程
中需要涉及到 ActonMapper。
面試:
1、瀏 覽 器 發 送 請 求 , 經 過 一 系 列 的 過 濾 器 後 , 到 達 核 心 過 濾 器
(StrutsPrepareAndExecuteFilter).
2、StrutsPrepareAndExecuteFilter 通過 ActonMapper 判斷當前的請求是否需要某個
Acton 處理,如果不需要,則走原來的流程。如果需要則把請求交給 ActonProxy 來
處理
3、ActonProxy 通過 Confguraton Manager 詢問框架的配置文件(Struts.xml),找到需要
調用的 Acton 類;
4、創建一個 ActonInvocaton 實例,來調用 Acton 的對應方法來獲取結果集的 name,在
調用前後會執行相關攔截器。
5、通過結果集的 Name 知道對應的結果集來對瀏覽器進行響應。
攔截、判斷、尋找、執行、響應
2.5.5 Struts2 中的攔截器,你都用它幹什麼?
java 裏的攔截器是動態攔截 Acton 調用的對象。它提供了一種機制可以使開發者可以
定義在一個 acton 執行的前後執行的代碼,也可以在一個 acton 執行前阻止其執行,同時
也提供了一種可以提取 acton 中可重用部分的方式。
在 AOP(Aspect-Oriented Programming)中攔截器用於在某個方法或字段被訪問之前,
進行攔截然後在之前或之後加入某些操作。
面試:
struts2 中的的功能(參數處理、文件上傳、字符編碼等)都是通過系統攔截器實現的。
如果業務需要,當然我們也可以自定義攔截器,進行可插拔配置,在執行 Acton 的方法
前後、加入相關邏輯完成業務。
使用場景:
1、用戶登錄判斷,在執行 Acton 的前面判斷是否已經登錄,如果沒有登錄的跳轉到登
錄頁面。
2、用戶權限判斷,在執行 Acton 的前面判斷是否具有,如果沒有權限就給出提示信息。
3、操作日誌......
4、......
2.5.6 簡單講一下 SpringMVC 的執行流程?
1. 用戶向服務器發送請求,請求被 Spring 前端控制 Servelt DispatcherServlet 捕獲;
2. DispatcherServlet 對請求 URL 進行解析,得到請求資源標識符(URI)。然後根據該
URI,調用 HandlerMapping 獲得該 Handler 配置的所有相關的對象(包括 Handler 對
象以及 Handler 對象對應的攔截器),最後以 HandlerExecutionChain 對象的形式返回;
3. DispatcherServlet 根據獲得的 Handler,選擇一個合適的 HandlerAdapter。(附註:
如果成功獲得 HandlerAdapter 後,此時將開始執行攔截器的 preHandler(...)方法)
4. 提取 Request 中的模型數據,填充 Handler 入參,開始執行
Handler(Controller)。 在填充 Handler 的入參過程中,根據你的配置,Spring 將幫你
做一些額外的工作:
HttpMessageConveter: 將請求消息(如 Json、xml 等數據)轉換成一個對象,將
對象轉換爲指定的響應信息
數據轉換:對請求消息進行數據轉換。如 String 轉換成 Integer、Double 等
數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日
期等
數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到 BindingResult 或
Error 中
5. Handler 執行完成後,向 DispatcherServlet 返回一個 ModelAndView 對象;
6. 根據返回的 ModelAndView,選擇一個適合的 ViewResolver(必須是已經註冊到
Spring 容器中的 ViewResolver)返回給 DispatcherServlet ;
7. ViewResolver 結合 Model 和 View,來渲染視圖
8. 將渲染結果返回給客戶端。
面試:
1、 用戶向服務器發送請求,請求被 Spring 前端控制 Servelt DispatcherServlet 捕獲(捕
獲)
2、 DispatcherServlet 對請求 URL 進行解析,得到請求資源標識符(URI)。然後根據該
URI,調用 HandlerMapping 獲得該 Handler 配置的所有相關的對象(包括 Handler 對象以及
Handler 對象對應的攔截器),最後以 HandlerExecutonChain 對象的形式返回;(查找
handler)
3、 DispatcherServlet 根據獲得的 Handler,選擇一個合適的 HandlerAdapter。 提取
Request 中的模型數據,填充 Handler 入參,開始執行 Handler(Controller), Handler
執行完成後,向 DispatcherServlet 返回一個 ModelAndView 對象(執行 handler)
4、DispatcherServlet 根據返回的 ModelAndView,選擇一個適合的 ViewResolver(必
須是已經註冊到 Spring 容器中的 ViewResolver) (選擇 ViewResolver)
5、通過 ViewResolver 結合 Model 和 View,來渲染視圖,DispatcherServlet 將渲染結果
返回給客戶端。(渲染返回)
快速記憶技巧:
核心控制器捕獲請求、查找 Handler、執行 Handler、選擇 ViewResolver,通過
ViewResolver 渲染視圖並返回
2.5.7 說一下 struts2 和 springMVC 有什麼不同?
目前企業中使用 SpringMvc 的比例已經遠遠超過 Struts2,那麼兩者到底有什麼區別,是很多
初學者比較關注的問題,下面我們就來對 SpringMvc 和 Struts2 進行各方面的比較:
1. 核 心控制器(前端控制器、預處理控制器):對於使用過 mvc 框架的人來說這個詞應該
不會陌生,核心控制器的主要用途是處理所有的請求,然後對那些特殊的請求 (控制器)
統一的進行處理(字符編碼、文件上傳、參數接受、異常處理等等),spring mvc 核心控制器是
Servlet,而 Struts2 是 Filter。
2.控制器實例:Spring Mvc 會比 Struts 快一些(理論上)。Spring Mvc 是基於方法設計,而
Sturts 是基於對象,每次發一次請求都會實例一個 acton,每個 acton 都會被注入 屬性,
而 Spring 更像 Servlet 一樣,只有一個實例,每次請求執行對應的方法即可(注意:由於是單
例實例,所以應當避免全局變量的修改,這樣會產生線程安全問題)。
3. 管理方式:大部分的公司的核心架構中,就會使用到 spring,而 spring mvc 又是 spring 中
的一個模塊,所以 spring 對於 spring mvc 的控制器管理更加簡單方便,而且提供了全 註解
方式進行管理,各種功能的註解都比較全面,使用簡單,而 struts2 需要採用 XML 很多的配
置參數來管理(雖然也可以採用註解,但是幾乎沒有公司那 樣使用)。
4.參數傳遞:Struts2 中自身提供多種參數接受,其實都是通過(ValueStack)進行傳遞和賦
值,而 SpringMvc 是通過方法的參數進行接收。
5.學習難度:Struts 更加很多新的技術點,比如攔截器、值棧及 OGNL 表達式,學習成本較
高,springmvc 比較簡單,很較少的時間都能上手。
6.intercepter 的實現機制:struts 有以自己的 interceptor 機制,spring mvc 用的是獨立的 AOP
方式。這樣導致 struts 的配置文件量還是比 spring mvc 大,雖然 struts 的配置能繼承,所以
我覺得論使用上來講,spring mvc 使用更加簡潔,開發效率 Spring MVC 確實比 struts2 高。
spring mvc 是方法級別的攔截,一個方法對應一個 request 上下文,而方法同時又跟一個 url
對應,所以說從架構本身上 spring3 mvc 就容易實現 restul url。struts2 是類級別的攔截,一
個類對應一個 request 上下文;實現 restul url 要費勁,因爲 struts2 acton 的一個方法可以
對應一個 url;而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方
法了。spring3 mvc 的方法之間基本上獨立的,獨享 request response 數據,請求數據通過參
數獲取,處理結果通過 ModelMap 交回給框架方法之間不共享變量,而 struts2 搞的就比較
亂,雖然方法之間 也是獨立的,但其所有 Acton 變量是共享的,這不會影響程序運行,卻
給我們編碼,讀程序時帶來麻煩。
7.spring mvc 處 理 ajax 請 求 , 直 接 通 過 返 回 數 據 , 方 法 中 使 用 注 解
@ResponseBody,spring mvc 自動幫我們對象轉換爲 JSON 數據。而 struts2 是通過插
件的方式進行處理
在 SpringMVC 流行起來之前,Struts2 在 MVC 框架中佔核心地位,隨着 SpringMVC 的出現,
SpringMVC 慢慢的取代 struts2,但是很多企業都是原來搭建的框架,使用 Struts2 較多。
2.5.8 說一下 Spring 中的兩大核心?
Spring 是什麼?
spring 是 J2EE 應用程序框架,是輕量級的 IoC 和 AOP 的容器框架(相對於重量級的
EJB),主要是針對 javaBean 的生命週期進行管理的輕量級容器,可以單獨使用,也可以和
Struts 框架,ibats 框架等組合使用。
1、IOC(Inversion of Control )或 DI(Dependency Injecton)
IOC 控制權反轉
原來:我的 Service 需要調用 DAO,Service 就需要創建 DAO
Spring:Spring 發現你 Service 依賴於 dao,就給你注入.
核心原理:就是配置文件+反射(工廠也可以)+容器(map)
2、AOP:面向切面編程
核心原理:使用動態代理的設計模式在執行方法前後或出現異常做加入相關邏輯。
我們主要使用 AOP 來做:
1、事務處理
2、權限判斷
3、日誌
4、....
2.5.9 AOP 是什麼?你都拿它做什麼?
3、AOP:面向切面編程
核心原理:使用動態代理的設計模式在執行方法前後或出現異常做加入相關邏輯。
我們主要使用 AOP 來做:
1、事務處理 執行方法前,開啓事務、執行完成後關閉事務、出現異常後回滾事務
2、權限判斷 在執行方法前,判斷是否具有權限
3、日誌 在執行前進行日誌處理
4、....
2.5.10 講一下 Spring 的事務傳播特性
多個事務存在是怎麼處理的策略
1. PROPAGATION_REQUIRED: 如果存在一個事務,則支持當前事務。如果沒有事務則
開啓
2. PROPAGATION_SUPPORTS: 如果存在一個事務,支持當前事務。如果沒有事務,
則非事務的執行
3. PROPAGATION_MANDATORY: 如果已經存在一個事務,支持當前事務。如果沒
有一個活動的事務,則拋出異常。
4. PROPAGATION_REQUIRES_NEW: 總是開啓一個新的事務。如果一個事務已經
存在,則將這個存在的事務掛起。
5. PROPAGATION_NOT_SUPPORTED: 總是非事務地執行,並掛起任何存在的事務。
6. PROPAGATION_NEVER: 總是非事務地執行,如果存在一個活動事務,則拋出異

7. PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務
中. 如果沒有活動事務, 則按 TransactionDefinition.PROPAGATION_REQUIRED 屬
性執行
Propagaton
Required 需要 如果存在一個事務,則支持當前事務。如果沒有事務則開啓
Supports 支持 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行
Mandatory 必要的 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則
拋出異常。
required_new 總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
Not_support 總是非事務地執行,並掛起任何存在的事務。
Never 絕不 總是非事務地執行,如果存在一個活動事務,則拋出異常
Nested 嵌套的 如果有就嵌套、沒有就開啓事務
2.5.11 Spring 事務的隔離級別
1. ISOLATION_DEFAULT: 這是一個 PlatfromTransactionManager 默認的隔離級別,使用
數據庫默認的事務隔離級別.
另外四個與 JDBC 的隔離級別相對應
2. ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務
可以看到這個事務未提交的數據。
這種隔離級別會產生髒讀,不可重複讀和幻像讀。
3. ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交後才能被另外一個事
務讀取。另外一個事務不能讀取該事務未提交的數據
4. ISOLATION_REPEATABLE_READ: 這種事務隔離級別可以防止髒讀,不可重複讀。但
是可能出現幻像讀。
它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況
產生(不可重複讀)。
5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理
爲順序執行。
除了防止髒讀,不可重複讀外,還避免了幻像讀。
其中的一些概念的說明:
髒讀: 指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交
到數據庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據。因爲這個數據
是還沒有提交的數據, 那麼另外一 個事務讀到的這個數據是髒數據,依據髒數據所做的
操作可能是不正確的。
不可重複讀: 指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一
個事務也訪問該同一數據。 那麼,在第一個事務中的兩次讀數據之間,由於第二個事務的
修改,那麼第一個事務兩次讀到的數據可能是不一樣的。這樣就發生了在一個事務內兩次
讀到的數據是不一樣的,因此稱爲是不可重複讀。
幻覺讀: 指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數
據進行了修改,這種修改涉及 到表中的全部數據行。同時,第二個事務也修改這個表中的
數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發
現表中還有沒有修改的數據行,就好象發生了幻覺一樣。
2.5.12 什麼是 ORM?
對象關係映射(Object Relatonal Mapping,簡稱 ORM)模式是一種爲了解決面向對象與
關係數據庫存在的互不匹配的現象的技術。簡單的說,ORM 是通過使用描述對象和數據庫
之間映射的元數據,將程序中的對象自動持久化到關係數據庫中。那麼,到底如何實現持
久化呢?一種簡單的方案是採用硬編碼方式(jdbc 操作 sql 方式),爲每一種可能的數據庫訪
問操作提供單獨的方法。
這種方案存在以下不足:
1.持久化層缺乏彈性。一旦出現業務需求的變更,就必須修改持久化層的接口
2.持久化層同時與域模型與關係數據庫模型綁定,不管域模型還是關係數據庫模型發
生變化,都要修改持久化曾的相關程序代碼,增加了軟件的維護難度。
ORM 提供了實現持久化層的另一種模式,它採用映射元數據來描述對象關係的映射,
使得 ORM 中間件能在任何一個應用的業務邏輯層和數據庫層之間充當橋樑。Java 典型的
ORM 框架有:Hibernate,ibats(mybats),speedframework。
ORM 的方法論基於三個核心原則:
簡單:以最基本的形式建模數據。
傳達性:數據庫結構被任何人都能理解的語言文檔化。
精確性:基於數據模型創建正確標準化了的結構。
對象關係映射(Object Relatonal Mapping,簡稱 ORM)模式是一種爲了解決面向對象
與關係數據庫存在的互不匹配的現象的技術。可以簡單的方案是採用硬編碼方式(jdbc 操作
sql 方式),爲每一種可能的數據庫訪問操作提供單獨的方法。這種方法存在很多缺陷,使

使用 ORM 框架(爲了解決解決面向對象與關係數據庫存在的互不匹配的現象的框架)來解決.
Hibernate,ibats(mybats),
2.5.13 iBats(mybats)與 Hibernate 有什麼不同?
相同點:
都是 java 中 orm 框架、屏蔽 jdbc api 的底層訪問細節,使用我們不用與 jdbc api 打
交道,就可以完成對數據庫的持久化操作。jdbc api 編程流程固定,還將 sql 語句與 java 代
碼混雜在了一起,經常需要拼湊 sql 語句,細節很繁瑣。
ibats 的好處:屏蔽 jdbc api 的底層訪問細節;將 sql 語句與 java 代碼進行分離;提供了將
結果集自動封裝稱爲實體對象和對象的集合的功能 .queryForList 返回對象集合,用
queryForObject 返回單個對象;提供了自動將實體對象的屬性傳遞給 sql 語句的參數。
Hibername 的好處:Hibernate 是一個全自動的 orm 映射工具,它可以自動生成 sql 語句,
並執行並返回 java 結果。
不同點:
1、hibernate 要比 ibats 功能強大很多。因爲 hibernate 自動生成 sql 語句。
2、ibats 需要我們自己在 xml 配置文件中寫 sql 語句,hibernate 我們無法直接控制該語
句,我們就無法去寫特定的高效率的 sql。對於一些不太複雜的 sql 查詢,hibernate 可以很
好幫我們完成,但是,對於特別複雜的查詢,hibernate 就很難適應了,這時候用 ibats 就
是不錯的選擇,因爲 ibats 還是由我們自己寫 sql 語句。
ibats 可以出來複雜語句,而 hibernate 不能。
3、ibats 要比 hibernate 簡單的多。ibats 是面向 sql 的,不同考慮對象間一些複雜的映
射關係。
2.5.14 Hibernate 映射對象的狀態
臨時狀態/瞬時狀態(transient):剛剛用 new 語句創建,沒有被持久化
不處於 session 中(沒有使用 session 的方法去操作臨時對象)。該對象成爲臨時對象
持久化狀態/託管狀態(persistent):已經被持久化,加入到 session 的緩存中。session 是沒有
關閉該狀態的對象爲持久化對象。
遊離狀態/脫管狀態(detached):已經被持久化,但不處於 session 中。
該狀態的對象爲遊離對象。
刪除狀態(removed):對象有關聯的 ID,並且在 Session 管理下,但是已經被計劃(事務提交
的時候,commit())刪除。如果沒有事務就不能刪除
相互轉換
2.5.15 介紹一下 Hibernate 的緩存?
一、why(爲什麼要用 Hibernate 緩存?)
Hibernate 是一個持久層框架,經常訪問物理數據庫。
爲了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。
緩存內的數據是對物理數據源中的數據的複製,應用程序在運行時從緩存讀寫數據,在特
定的時刻或事件會同步緩存和物理數據源的數據。
爲了提供訪問速度,把磁盤或數據庫訪問變成內存訪問。
二、what(Hibernate 緩存原理是怎樣的?)Hibernate 緩存包括兩大類:Hibernate 一級緩
存和 Hibernate 二級緩存。
1.Hibernate 一級緩存又稱爲“Session 的緩存”。
Session 緩存內置不能被卸載,Session 的緩存是事務範圍的緩存(Session 對象的生命週期
通常對應一個數據庫事務或者一個應用事務)。
一級緩存中,持久化類的每個實例都具有唯一的 OID。
2.Hibernate 二級緩存又稱爲“SessionFactory 的緩存”。
由於 SessionFactory 對象的生命週期和應用程序的整個過程對應,因此 Hibernate 二級緩存
是進程範圍或者集羣範圍的緩存,有可能出現併發問題,因此需要採用適當的併發訪問策
略,該策略爲被緩存的數據提供了事務隔離級別。
第二級緩存是可選的,是一個可配置的插件,默認下 SessionFactory 不會啓用這個插件。
Hibernate 提供了 org.hibernate.cache.CacheProvider 接口,它充當緩存插件與 Hibernate 之間
的適配器。
面試:
Hibernate 中的緩存分一級緩存和二級緩存。
一級緩存就是 Session 級別的緩存,在事務範圍內有效是,內置的不能被卸載。二級緩存
是 SesionFactory 級別的緩存,從應用啓動到應用結束有效。是可選的,默認沒有二級緩存,
需要手動開啓。
保存數據庫後,在內存中保存一份,如果更新了數據庫就要同步更新。
什麼樣的數據適合存放到第二級緩存中?
1) 很少被修改的數據 帖子的最後回覆時間
2) 經常被查詢的數據 電商的地點
2) 不是很重要的數據,允許出現偶爾併發的數據
3) 不會被併發訪問的數據
4) 常量數據
擴展:hibernate 的二級緩存默認是不支持分佈式緩存的。使用 memcahe,redis 等中央
緩存來代替二級緩存。
2.5.16 簡單講一下 webservice 使用的場景?
webservice 是一個 SOA(面向服務的編程)的架構,它是不依賴於語言,不依賴於平
臺,可以實現不同的語言間的相互調用,通過 Internet 進行基於 Http 協議的網絡應用間的
交互。
1、異構系統(不同語言)的整合
2、不同客戶端的整合 瀏覽器、手機端(android,ios.塞班)、微信單、PC 端等終端來訪

3、實實在在的列子:
天氣預報:可以通過實現 webservice 客戶端調用遠程天氣服務實現的。
單點登錄:一個服務是所有系統的登錄
2.5.17 簡單介紹一下 actvit?
Activiti 是一個業務流程管理(BPM)和工作流系統,適用於開發人員和系統管理員。其核心是超快速,
穩定的 BPMN2 流程引擎。它易於與 Spring 集成使用。
主要要在 OA 中,把線下流程放到線上。 把現實生活中一些流程固話定義到系統中,然後通過輸入表單
數據完成業務。
他可用在 OA 系統的流程管理中:
請假流程 小於三天,一級主管審批,大於三天二級才能審批。
報銷流程 1000 2000 3000>....
如果你想找專門這方面的工作,要下去複習。


2.6 高級部分


2.6.1 有沒有用過 linux?你都用它來做什麼?
Linux 是一個長時間運行比較穩定的操作系統,所有我們一般會拿它作爲服務器(web,db,app
等)。
Linux 本身具有 C 的編譯環境、我們的一些軟件是沒有軟件包(redis、nginx 等)的,需要在
Linux 的 C 編譯環境編譯得到軟件包.
2.6.2 說一下 linux 下面的一下常用命令?
常用:
Pwd 獲取當前路徑
Cd 跳轉到目錄
Su -u 切換到管理員
Ls ls 列舉目錄
文件操作命令:
文件
tail 查看
rm -rf
vi
文件夾
mkdir
rm -r
2.6.3 你是使用什麼來連接遠程的 Linux 服務器的?
需要依賴於 Linux 服務器安裝 ssh 服務端,一般這個 ssh 服務的端口 22.
需要依賴於 Linux 服務器安裝 sfp 服務端,一般這個 sfp 服務的端口 25.
使用 ssh 客戶端連接 linux 服務器,就有點兒像 windows 下面的遠程連接。但是 linux 通過
ssh 連接上以後是沒有圖形界面,全是命令行。
Puty
Xshell
使用 sfp 客戶端來連接 sfp 服務端,來上傳和下載文件.(上傳安裝包,修改了配置文件上
傳。)
Winscp
xfp
企業中常用的兩種組合:
puty+winscp
Xshell+xfp=xmanager
面試:使用 xshell、puty 等 ssh 客戶端來連接服務器,使用 xfp、winscp 等 sfp 客戶端
來上傳和現在文件。連接和上傳、下載必須依賴於服務器的 ssh、sfp 服務,也就是 linux
服務器需要啓動這兩個服務。
2.6.4 有沒有使用過雲主機?
使用過,在原來的公司,我們沒有使用自己的服務器,而是租用阿里的雲主機。
沒有使用過,但是有所瞭解。
雲主機就是一些雲服務運營商(阿里、華爲、西部數碼、新浪等),提供的遠程的服務器功
能,我們開發者或者企業只需按需付費就可以租用對應的服務器。
使用 ssh 和 sfp 來進行操作。
2.6.5 有沒有做過數據庫優化方面的事情?
做過 mysql 數據庫的優化、其他數據庫類似
定位:查找、定位慢查詢
優化手段:
a) 創建索引:創建合適的索引,我們就可以現在索引中查詢,查詢到以後直接找對應
的記錄。
b) 分表 :當一張表的數據比較多或者一張表的某些字段的值比較多並且很少使用
時,採用水平分表和垂直分表來優化
c) 讀寫分離:當一臺服務器不能滿足需求時,採用讀寫分離的方式進行集羣。
d) 緩存:使用 redis 來進行緩存
e) 一些常用優化技巧
2.6.6 查找慢查詢並定位慢查詢?
在項目自驗項目轉測試之前,在啓動 mysql 數據庫時開啓慢查詢,並且把執行慢的語句
寫到日誌中,在運行一定時間後。通過查看日誌找到慢查詢語句。
要找出項目中的慢 Sql 時
1、關閉數據庫服務器(關閉服務)
2、把慢查詢記錄到日誌中
3、設置慢查詢時間
4、找出日誌中的慢查詢 SQL
使用 explain 慢查詢語句,來詳細分析語句的問題.
2.6.6 數據庫優化之遵循範式?
數據庫表設計時需要遵循方式
表的範式,是首先符合 1NF, 才能滿足 2NF , 進一步滿足 3NF
1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解.只要數據庫是關係
型數據庫(mysql/oracle/db2/sysbase/sql server),就自動的滿足 1NF.關係型數據庫中是不允許
分割列的。
2NF:表中的記錄是唯一的.通常我們設計一個主鍵來實現
3NF:即表中不要有冗餘數據, 就是說,表的信息,如果能夠被推導出來,就不應該單獨
的設計一個字段來存放.(外鍵)
反 3NF :沒有冗餘的數據庫未必是最好的數據庫,有時爲了提高運行效率,就必須降低
範式標準,適當保留冗餘數據。具體做法是: 在概念數據模型設計時遵守第三範式,降低
範式標準的工作放到物理數據模型設計時考慮。降低範式就是增加字段,允許冗餘。 訂
單和訂單項、相冊瀏覽次數和照片的瀏覽次數
2.6.7 選擇合適的存儲引擎
在開發中,我們經常使用的存儲引擎 myisam / innodb/ memory
MyISAM 存儲引擎
如果表對事務要求不高,同時是以查詢和添加爲主的,我們考慮使用 myisam 存儲
引擎. 比如 bbs 中的 發帖表,回覆表.
INNODB 存儲引擎:
對事務要求高,保存的數據都是重要數據,我們建議使用 INNODB,比如訂單表,
賬號表.
Memory 存儲
我們數據變化頻繁,不需要入庫,同時又頻繁的查詢和修改,我們考慮使用
memory, 速度極快.
問 MyISAM 和 INNODB 的區別(主要)
1. 事務安全 myisam 不支持事務而 innodb 支持
2. 查詢和添加速度 myisam 不用支持事務就不用考慮同步鎖,查找和添加和添加的速
度快
3. 支持全文索引 myisam 支持 innodb 不支持
4. 鎖機制 myisam 支持表鎖而 innodb 支持行鎖(事務)
5. 外鍵 MyISAM 不支持外鍵, INNODB 支持外鍵. (通常不設置外鍵,通常是在程序中
保證數據的一致)
2.6.8 數據庫優化之創建合適的索引?
索引(Index)是幫助 DBMS 高效獲取數據的數據結構。
分類:普通索引/唯一索引/主鍵索引/全文索引
普通索引:允許重複的值出現
唯一索引:除了不能有重複的記錄外,其它和普通索引一樣(用戶名、用戶身份證、
email,tel)
主鍵索引:是隨着設定主鍵而創建的,也就是把某個列設爲主鍵的時候,數據庫就會
給改列創建索引。這就是主鍵索引.唯一且沒有 null 值
全文索引:用來對錶中的文本域(char,varchar,text)進行索引, 全文索引針對 MyIsam
explain select * from artcles where match(ttle,body) against(‘database’);【會使用全
文索引】
2.6.9 索引使用小技巧?*****
索引弊端
1.佔用磁盤空間。
2.對 dml(插入、修改、刪除)操作有影響,變慢。
使用場景:
a: 肯定在 where 條件經常使用,如果不做查詢就沒有意義
b: 該字段的內容不是唯一的幾個值(sex)
c: 字段內容不是頻繁變化.
具體技巧:
1. 對於創建的多列索引(複合索引),不是使用的第一部分就不會使用索引。
alter table dept add index my_ind (dname,loc); // dname 左邊的列,loc 就是右邊的列
explain select * from dept where dname='aaa'\G 會使用到索引
explain select * from dept where loc='aaa'\G 就不會使用到索引
2. 對於使用 like 的查詢,查詢如果是’%aaa’不會使用到索引而‘aaa%’會使用到索引。
explain select * from dept where dname like '%aaa'\G 不能使用索引
explain select * from dept where dname like 'aaa%'\G 使用索引.
所以在 like 查詢時,‘關鍵字’的最前面不能使用 % 或者 _這樣的字符.,如果一定要前面
有變化的值,則考慮使用 全文索引->sphinx.
3. 如果條件中有 or,有條件沒有使用索引,即使其中有條件帶索引也不會使用。換言之,
就是要求使用的所有字段,都必須單獨使用時能使用索引.
4. 如果列類型是字符串,那一定要在條件中將數據使用引號引用起來。否則不使用索
引。
expain select * from dept where dname=’111’;
expain select * from dept where dname=111;(數值自動轉字符串)
expain select * from dept where dname=qqq;報錯
也就是,如果列是字符串類型,無論是不是字符串數字就一定要用 ‘’ 把它包括起
來.
5. 如果 mysql 估計使用全表掃描要比使用索引快,則不使用索引。
表裏面只有一條記錄
2.6.10 數據庫優化之分表?
分表分爲水平(按行)分表和垂直(按列)分表
根據經驗,Mysql 表數據一般達到百萬級別,查詢效率會很低,容易造成表鎖,甚至堆積
很多連接,直接掛掉;水平分表能夠很大程度較少這些壓力。
按行數據進行分表。
如果一張表中某個字段值非常多(長文本、二進制等),而且只有在很少的情況下會查詢。
這時候就可以把字段多個單獨放到一個表,通過外鍵關聯起來。
考試詳情,一般我們只關注分數,不關注詳情。
水平分表策略:
1.按時間分表
這種分表方式有一定的侷限性,當數據有較強的實效性,如微博發送記錄、微信
消息記錄等,這種數據很少有用戶會查詢幾個月前的數據,如就可以按月分表。
2.按區間範圍分表
一般在有嚴格的自增 id 需求上,如按照 user_id 水平分表:
table_1 user_id 從 1~100w
table_2 user_id 從 101~200w
table_3 user_id 從 201~300w
3.hash 分表*****
通過一個原始目標的 ID 或者名稱通過一定的 hash 算法計算出數據存儲表的表名,
然後訪問相應的表。
2.6.11 數據庫優化之讀寫分離
一臺數據庫支持的最大併發連接數是有限的,如果用戶併發訪問太多。一臺服務器滿足不
要要求是就可以集羣處理。Mysql 的集羣處理技術最常用的就是讀寫分離。
主從同步
數據庫最終會把數據持久化到磁盤,如果集羣必須確保每個數據庫服務器的數據
是一直的。能改變數據庫數據的操作都往主數據庫去寫,而其他的數據庫從主數
據庫上同步數據。
讀寫分離
使用負載均衡來實現寫的操作都往主數據去,而讀的操作往從服務器去。
2.6.12 數據庫優化之緩存
在持久層(dao)和數據庫(db)之間添加一個緩存層,如果用戶訪問的數據已經緩存起來
時,在用戶訪問時直接從緩存中獲取,不用訪問數據庫。而緩存是在操作內存級,訪問速
度快。
作用:減少數據庫服務器壓力,減少訪問時間。
Java 中常用的緩存有,
1、hibernate 的二級緩存。該緩存不能完成分佈式緩存。
2、可以使用 redis(memcahe 等)來作爲中央緩存。
對緩存的數據進行集中處理
2.6.13 語句優化小技巧
DDL 優化:
1 、通過禁用索引來提供導入數據性能 。 這個操作主要針對有數據庫的表,追加數

//去除鍵
alter table test3 DISABLE keys;
//批量插入數據
insert into test3 select * from test;
//恢復鍵
alter table test3 ENABLE keys;
2、 關閉唯一校驗
set unique_checks=0 關閉
set unique_checks=1 開啓
3、修改事務提交方式(導入)(變多次提交爲一次)
set autocommit=0 關閉
//批量插入
set autocommit=1 開啓
DML 優化(變多次提交爲一次)
insert into test values(1,2);
insert into test values(1,3);
insert into test values(1,4);
//合併多條爲一條
insert into test values(1,2),(1,3),(1,4)
DQL 優化
Order by 優化
1、多用索引排序
2
、普通結果排序(非索引排序)Filesort
group by 優化
是使用 order by null,取消默認排序
子查詢優化
在客戶列表找到不在支付列表的客戶
#在客戶列表找到不在“支付列表”的客戶 , 查詢沒買過東西的客戶
explain
select * from customer where customer_id not in (select DISTINCT customer_id from
payment); #子查詢 -- 這種是基於 func 外鏈
explain
select * from customer c lef join payment p on(c.customer_id=p.customer_id) where
p.customer_id is null -- 這種是基於“索引”外鏈
Or 優化
在兩個獨立索引上使用 or 的性能優於
1
、 or 兩邊都是用索引字段做判斷,性能好!!
2
、 or 兩邊,有一邊不用,性能差
3、 如果 employee 表的 name 和 email 這兩列是一個複合索引,但是如果是 :
name='A' OR email='B' 這種方式,不會用到索引!
limit 優化
select flm_id,descripton from flm order by ttle limit 50,5;
select a.flm_id,a.descripton from flm a inner join (select flm_id from flm order by ttle
limit 50,5)b on a.flm_id=b.flm_id
2.6.14 jdbc 批量插入幾百萬數據怎麼實現?*****
1、變多次提交爲一次
3、使用批量操作
省出的時間可觀。
像這樣的批量插入操作能不使用代碼操作就不使用,可以使用存儲過程來實現。
2.6.15 有沒有使用過 redis? Redis 是什麼
Redis 是一個 key-value 的 nosql 數據庫.先存到內存中,會根據一定的策略持久化到磁盤,即
使斷電也不會丟失數據。支持的數據類型比較多。
主要用來做緩存數據庫的數據和 web 集羣時當做中央緩存存放 seesion
2.4.15 Redis 和 memche 的比較?
1、 Redis 和 Memcache 都是將數據存放在內存中,都是內存數據庫。不過 memcache 還可
用於緩存其他東西,例如圖片、視頻等等。
2、Redis 不僅僅支持簡單的 k/v 類型的數據,同時還提供 list,set,hash 等數據結構的存儲。
3、虛擬內存--Redis 當物理內存用完時,可以將一些很久沒用到的 value 交換到磁盤
2.6.16 簡單說一下 redis 的使用場景?
緩存:
把經常需要查詢的、很少修改數據,放到讀速度很快的空間(內存),以便下次訪問減
少時間。減輕壓力,減少訪問時間.
計數器:
redis 中的計數器是原子性的內存操作。
可以解決庫存溢出問題.進銷存系統庫存溢出。
session 緩存服務器:
web 集羣時作爲 session 緩存服務器
緩存隊列等
2.6.17 redis 對象保存方式?
Json 字符串:
需要把對象轉換爲 json 字符串,當做字符串處理。直接使用 set get 來設置或者或。
優點:設置和獲取比較簡單
缺點:沒有提供專門的方法,需要把把對象轉換爲 json。(jsonlib)
字節:
需要做序列號,就是把對象序列化爲字節保存。
如果是擔心 JSON 轉對象會消耗資源的情況,這個問題需要考量幾個地方,
第一點:就是使用的 JSON 轉換 lib 是否就會存在性能問題。
第二點:就是數據的數據量級別,如果是存儲百萬級的大數據對象,建議採用存儲序列化
對象方式。如果是少量的數據級對象,或者是數據對象字段不多,還是建議採用 JSON 轉換
成 String 方式。
畢竟 redis 對存儲字符類型這部分優化的非常好。具體採用的方式與方法,還要看你所使用
的場景。
2.6.18 Redis 數據淘汰機制
在 redis 中,允許用戶設置最大使用內存大小 server.maxmemory,在內存限定的情況下是
很有用的。譬如,在一臺 8G 機子上部署了 4 個 redis 服務點,每一個服務點分配 1.5G 的
內存大小,減少內存緊張的情況,由此獲取更爲穩健的服務。
內存大小有限,需要保存有效的數據?
redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。
redis 提供 6 種數據淘汰策略:
volatle-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的
數據淘汰
volatle-tl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據
淘汰
volatle-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘

allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-envicton(驅逐):禁止驅逐數據
2.6.19 Java 訪問 Redis
1、使用 jedis java 客戶端來訪問 redis 服務器,有點類似通過 jdbc 訪問 mysql 一樣。
2、當然如果是 spring 進行集成時,可以使用 spring data 來訪問 redis,spring data 只是對 jedis
的二次封裝。jdbcTemplate jdbc 關係一樣
2.6.20 Redis 集羣
當一臺數據無法滿足要求,可以使用 reids 集羣來處理,類似於 mysql 的讀寫分離。
2.6.21 簡單介紹一下微信公共號的分類?
公衆號:個人和企業都能申請
服務號:企業才能申請
企業號:企業才能申請
2.6.22 微信開發原理
微信公衆平臺開發者,通過接入認證的方式,讓我們的服務器能處理來自微信服務器轉發
的微信用戶的請求,處理完成後返回給微信服務器,有微信服務器對用戶響應。
2.6.23 怎麼把微信和業務平臺綁定?
微信用戶和註冊用戶綁定?
讓微信用戶也能完成註冊用戶的功能。
用戶註冊實體中包含一個微信號的字段,當我進行綁定時就是修改用戶的微信號字段。
當然我們在進行菜單跳轉到頁面後,我們是無法直接獲取微信號的。要通過微信網頁授權
來獲取微信號。
第一步:用戶同意授權,獲取 code
https://open.weixin.qq.com/connect/oauth2/authorize?
appid=APPID&redirect_uri=REDIRECT_URI&response_type=c
ode&scope=SCOPE&state=STATE#wechat_redirect 若提示“該
鏈接無法訪問”,請檢查參數是否填寫錯誤,是否擁有 scope 參數對應
的授權作用域權限。
第二步:通過 code 換取網頁授權 openId 也就是我們微信號
獲 取 code 後 , 請 求 以 下 鏈 接 獲 取 access_token :
https://api.weixin.qq.com/sns/oauth2/access_token?
appid=APPID&secret=SECRET&code=CODE&grant_type=aut
horization_code
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章