在這裡記錄一下我面試甲方和外包遇到的SSM相關的面試題。
SpringMVC面試題:
1、說一下MVC的執行流程(請求流程或者一個request要經過哪些類)?(高頻)
使用者發起請求到前端控制器(DispatchServlet);
前端控制器接到請求後會調用HandlerMapping處理映射器;
HandlerMapping根據url,查找該url對應方法的反射對象(具體的處理器),生成處理器執行鍊HandlerExecutionChain(包括處理器對象和處理器攔截器)一并傳回給DispatcherServlet;
DispatcherServlet根據處理器Handler擷取處理器擴充卡HandlerAdapter;
擴充卡執行handler,通過反射調用controller中的業務方法(處理一系列的操作,如:參數封裝,資料格式轉換,資料驗證等操作);
handler執行完成後傳回一個ModelandView對象給前端控制器;
前端控制器将modelanview傳給viewReslover視圖解析器;
視圖解析器解析後傳回具體的view;
前端控制器根據view進行視圖的渲染(将模型資料填充到視圖中);
DispatcherServlet響應使用者;
2、說一說SSM常用的注解?
3、說一說一個客戶請求,從前端到背景的整個流程(一個http請求的會經過哪些流程)?
Spring面試題點選此處。
Mybatis面試題:
1、Mybatis中#{},${}的差別?
#{}會被預編譯成占位符,可以防止SQL注入問題,不需要資料類型的手動轉換,一個參數時可以使用任意的參數名接收參數。
${}非預編譯,直接SQL拼接,不可以防止SQL注入,需要關注資料類型的轉換(如字元串類型’ ${id} '),一個參數時預設必須是value接收。
2、怎麼防止SQL注入?
代碼層防止SQL注入攻擊方式的最佳方案就是SQL預編譯(原始使用preparement,mybatis使用#{})。
确認每種資料的類型,比如是數字,資料庫則必須使用int類型來存儲。
規定資料長度,能在一定程度上防止SQL注入。
嚴格限制資料庫權限,能最大程度減少SQL注入的危害。
避免直接響應一些SQL異常資訊,SQL發生異常後,自定義異常進行響應。
過濾參數中含有的一些資料庫關鍵詞(前後端都可以進行,正規表達式。)
3、Mybatis的動态SQL,常用的動态标簽?
動态sql,常見标簽
choose(when,otherwise), trim(where,set),foreach,sql片段。
4、Mybatis的優缺點?
Mybatis的優缺點
5、說一下Mybatis的一級緩存和二級緩存?
一級緩存是SqlSession級别的緩存。在操作資料庫時需要構造sqlSession對象,在對象中有一個資料結構(HashMap)用于存儲緩存資料。不同的sqlSession之間的緩存資料區域(HashMap)是互相不影響的。
二級緩存是mapper級别的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。
緩存的使用順序(二級緩存需要手動開啟,使用二級緩存可能引起髒讀問題,這個出現的原因是因為不同的Mapper查詢隔離分别使用不同的存儲空間,那麼當兩個Mapper操作同一張表時就出現髒讀的問題,解決方案使緩存區共享):
當mybatis執行一個查詢的時候,會先去二級緩存中查詢資料。有就直接傳回。
如果二級緩存中沒有資料,再到一級緩存中擷取,有就直接傳回。
如果二級,一級都沒有要查的資料,則發sql語句到資料庫查詢。
查到結果後會馬上放到一級緩存中。
當SqlSession關閉的時候,會把一級緩存中的資料同步到二級緩存中。
6、mybatis和mybatis-plus的差別?
Mybatis-Plus是一個Mybatis的增強工具,它在Mybatis的基礎上做了增強,卻不做改變。我們在使用Mybatis-Plus之後既可以使用Mybatis-Plus的特有功能,又能夠正常使用Mybatis的原生功能。Mybatis-Plus簡稱MP是為簡化開發、提高開發效率而生,但它也提供了一些很有意思的插件,比如SQL性能監控、樂觀鎖、執行分析等。
專注和簡單一直是我的秘訣之一。簡單可能比複雜更難做到:你必須努力思路理清,進而使其變得簡單。但最終這是值得的,因為一旦你做到了,便可以創造奇迹。