天天看點

Mybatis高頻面試題——計算機網絡

一、#{}、${}差別

#{}是預編譯處理,KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 21: …串替換。 Mybatis在處理#̲{}時,會将sql中的#{}替…{}時,就是把${}替換成變量的值。

使用#{}可以有效的防止SQL注入,提高系統安全性。

二、請說說MyBatis的工作原理

在學習 MyBatis 程式之前,需要了解一下 MyBatis 工作原理,以便于了解程式。MyBatis 的工作原理如下圖

Mybatis高頻面試題——計算機網絡

1)讀取 MyBatis 配置檔案:mybatis-config.xml 為 MyBatis 的全局配置檔案,配置了 MyBatis 的運作環境等資訊,例如資料庫連接配接資訊。

2)加載映射檔案。映射檔案即 SQL 映射檔案,該檔案中配置了操作資料庫的 SQL 語句,需要在 MyBatis 配置檔案 mybatis-config.xml 中加載。mybatis-config.xml 檔案可以加載多個映射檔案,每個檔案對應資料庫中的一張表。

3)構造會話工廠:通過 MyBatis 的環境等配置資訊建構會話工廠 SqlSessionFactory。

4)建立會話對象:由會話工廠建立 SqlSession 對象,該對象中包含了執行 SQL 語句的所有方法。

5)Executor 執行器:MyBatis 底層定義了一個 Executor 接口來操作資料庫,它将根據 SqlSession 傳遞的參數動态地生成需要執行的 SQL 語句,同時負責查詢緩存的維護。

6)MappedStatement 對象:在 Executor 接口的執行方法中有一個 MappedStatement 類型的參數,該參數是對映射資訊的封裝,用于存儲要映射的 SQL 語句的 id、參數等資訊。

7)輸入參數映射:輸入參數類型可以是 Map、List 等集合類型,也可以是基本資料類型和 POJO 類型。輸入參數映射過程類似于 JDBC 對 preparedStatement 對象設定參數的過程。

8)輸出結果映射:輸出結果類型可以是 Map、 List 等集合類型,也可以是基本資料類型和 POJO 類型。輸出結果映射過程類似于 JDBC 對結果集的解析過程。

三、Mybatis插件

Executor:執行增删改查的操作

StatementHandler:處理SQL的預編譯,設定參數等相關操作

ParameterHandler:設定預編譯參數用的

ResultSetHandler:處理結果集

Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis使用JDK的動态代理,為需要攔截的接口生成代理對象以實作接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,隻會攔截那些你指定需要攔截的方法。

實作Mybatis的Interceptor接口并複寫intercept()方法,然後在給插件編寫注解,指定要攔截哪一個接口的哪些方法即可,記住,别忘了在配置檔案中配置你編寫的插件。

四、緩存

Mybatis的一級、二級緩存

1)一級緩存: 基于 PerpetualCache 的 HashMap 本地緩存,其存儲作用域為 Session,當 Session flush 或 close 之後,該 Session 中的所有 Cache 就将清空,預設打開一級緩存。

2)二級緩存與一級緩存其機制相同,預設也是采用 PerpetualCache,HashMap 存儲,不同在于其存儲作用域為 Mapper(Namespace),并且可自定義存儲源,如 Ehcache。預設不打開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實作Serializable序列化接口(可用來儲存對象的狀态),可在它的映射檔案中配置 ;

3)對于緩存資料更新機制,當某一個作用域(一級緩存 Session/二級緩存Namespaces)的進行了C/U/D 操作後,預設該作用域下所有 select 中的緩存将被 clear。

Why?

一級緩存:在同一個會話中可以執行,一級緩存可以放在Sqlsession

作用域:session

更新資料會導緻一級緩存清空。

問題:一級緩存範圍太小,如果一個會話修改資料成功,另一個會話依然會讀到緩存。存在讀取就資料的情況,是以要引出了二級緩存。

五、Mybatis是否支援延遲加載?如果支援,它的實作原理是什麼?

Mybatis僅支援association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置檔案中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。

它的原理是,使用CGLIB建立目标對象的代理對象,當調用目标方法時,進入攔截器方法,比如調用a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那麼就會單獨發送事先儲存好的查詢關聯B對象的sql,把B查詢上來,然後調用a.setB(b),于是a的對象b屬性就有值了,接着完成a.getB().getName()方法的調用。這就是延遲加載的基本原理。

當然了,不光是Mybatis,幾乎所有的包括Hibernate,支援延遲加載的原理都是一樣的。

六、Mybatis中分頁的插件

實體分頁

實體分頁依賴的是某一實體實體,這個實體實體就是資料庫,即:在查詢資料庫時在庫裡執行分頁,

比如MySQL資料庫提供了limit關鍵字,程式員隻需要編寫帶有limit關鍵字的SQL語句,資料庫傳回的就是分頁結果。

邏輯(記憶體)分頁

邏輯分頁依賴的是程式員編寫的代碼。資料庫傳回的不是分頁結果,而是全部資料,然後再由程式員通過代碼擷取分頁資料,(取出全部資料先存于記憶體中,再取出需要的資料)

常用的操作是一次性從資料庫中查詢出全部資料并存儲到List集合中,因為List集合有序,再根據索引擷取指定範圍的資料。

PageHelper: 實體分頁(資料庫中分頁), 通過攔截器加 limit 語句進行分頁

RowBounds: 邏輯分頁(在記憶體中一次加載所有的資料),資料量大的時候壓力較大

對比

1.資料庫負擔

實體分頁每次都通路資料庫,邏輯分頁隻通路一次資料庫,實體分頁對資料庫造成的負擔大。

2.伺服器負擔

邏輯分頁一次性将資料讀取到記憶體,占用了較大的内容空間,實體分頁每次隻讀取一部分資料,占用記憶體空間較小。

3.實時性

邏輯分頁一次性将資料讀取到記憶體,資料發生改變,資料庫的最新狀态不能實時反映到操作中,實時性差。實體分頁每次需要資料時都通路資料庫,能夠擷取資料庫的最新狀态,實時性強。

4.适用場合

邏輯分頁主要用于資料量不大、資料穩定的場合,實體分頁主要用于資料量較大、更新頻繁的場合。

七、Mybatis與Hibinate的差別

(1)hibernate是全自動,而mybatis是半自動

hibernate完全可以通過對象關系模型實作對資料庫的操作,擁有完整的JavaBean對象與資料庫的映射結構來自動生成sql。而mybatis僅有基本的字段映射,對象資料以及對象實際關系仍然需要通過手寫sql來實作和管理。

(2)sql直接優化上,mybatis要比hibernate友善很多

由于mybatis的sql都是寫在xml裡,是以優化sql比hibernate友善很多。而hibernate的sql很多都是自動生成的,無法直接維護sql;雖有hql,但功能還是不及sql強大,見到報表等變态需求時,hql也歇菜,也就是說hql是有局限的;hibernate雖然也支援原生sql,但開發模式上卻與orm不同,需要轉換思維,是以使用上不是非常友善。總之寫sql的靈活度上hibernate不及mybatis。

随着使用情況的不斷增多,我又做了進一步的總結總結:

mybatis:小巧、友善、高效、簡單、直接、半自動

hibernate:強大、友善、高效、複雜、繞彎子、全自動

面試題:MyBatis與Hibernate差別

八、計算機網絡

計算機網絡高頻面試題目

九、Linux高頻面試題-1、如何檢視linux端口被哪個程序占用?

1、查詢被占用的端口。首先是需要輸入指令,檢視被占用的端口的程序,netstat -tunpl |grep 端口号

Mybatis高頻面試題——計算機網絡

2、查詢程序id。通過上面的指令就可以列出,這個端口被哪些應用程式所占用,然後找到對應的程序ID,

Mybatis高頻面試題——計算機網絡

3、根據內建id查詢程序。如果想詳細檢視這個程序,ID具體是哪一個程序,可以通過指令的方式進行檢視程序的詳細資訊,ps -ef|grep 程序ID

Mybatis高頻面試題——計算機網絡

4、檢視程序詳情資訊。通過執行上面的指令,就可以看到這個程序的詳細資訊,同時也可以看到這個程序存在的目錄,程序執行的檔案等資訊,

Mybatis高頻面試題——計算機網絡

5、檢視進行所在目錄。通過ll /proc/程序ID/cwd 指令,可以直接檢視程序所在的目錄,這樣的話就可以快速定位到程序的目錄,

Mybatis高頻面試題——計算機網絡

6,、操作程序。查找他的新車目錄之後,就可以對這個應用程式進行一系列的操作,比如說重新開機删除等,

Mybatis高頻面試題——計算機網絡

Linux系統如何檢視端口8080的程序

Linux高頻指令

【Linux指令01】21個必備的Linux指令

跨域方式

1、Jsonp

2、Vue使用http-proxy-middleware 代了解決

3、使用@CorsOrigin()注解:

TCP與UDP的差別

UDP協定和TCP協定都是傳輸層協定。

TCP(Transmission Control Protocol,傳輸控制協定)提供的是面向連接配接,可靠的位元組流服務。即客戶和伺服器交換資料前,必須現在雙方之間建立一個TCP連接配接,之後才能傳輸資料。并且提供逾時重發,丢棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。(三次握手和四次握手)

UDP(User Data Protocol,使用者資料報協定)是一個簡單的面向資料報的運輸層協定。它不提供可靠性,隻是把應用程式傳給IP層的資料報發送出去,但是不能保證它們能到達目的地。由于UDP在傳輸資料報前不用再客戶和伺服器之間建立一個連接配接,且沒有逾時重發等機制,是以傳輸速度很快。

面試題:UDP&TCP的差別

Time Wait狀态為什麼2MSL?

持續存在2MSL的話,就能保證在兩個傳輸方向上的尚未被接收或遲到的封包段都已經消失(否則伺服器立刻重新開機, 可能會收到來自上一個程序的遲到的資料, 但是這種資料很可能是錯誤的)。

同時也是在理論上保證最後一個封包可靠到達(假設最後⼀一個ACK丢失, 那麼伺服器會再重發一個 FIN.。這時雖然用戶端的程序不在了, 但是TCP連接配接還在, 仍然可以重發LAST_ACK)。

HTTP與HTTPS的差別

HTTP與HTTPS的差別

輸入URL,一次網絡請求的流程

一、首先判斷是否存在緩存,如果緩存存在且不過期,那麼傳回緩存

二、域名解析:使用DNS将域名解析為IP位址;

三、通過TCP三向交握建立連接配接

四、用戶端向服務端發起HTTP請求

五、服務端向用戶端傳回資料

六、四次揮手斷開連接配接

七、浏覽器得到HTML标簽代碼,解析HTML代碼中的資源,例如js,css,img等;

八、浏覽器對頁面進行渲染呈現給使用者

TCP/IP協定 + 封裝HTTP請求

應用層 ——————————用戶端在應用層發送HTTP請求

傳輸層 ——————————在傳輸層(TCP)加入端口号

網絡層 ——————————在網絡層(IP)加入IP位址

資料鍊路層 ————————在資料鍊路層加入MAC位址

備注:在傳輸層會發生三次握手和四次揮手,我會另寫文章。

Mybatis高頻面試題——計算機網絡

上述流程說的是請求的過程,而對于目标伺服器的請求處理的流程就是上面的一個逆過程,請求是将資料進行封裝,而請求處理則是對得到的數包的拆包過程,每一層擷取需要的東西。

TCP/IP協定的具體介紹

Mybatis高頻面試題——計算機網絡

應用層:提供面向使用者的應用程式。簡單網絡管理SNMP協定,簡單網絡傳輸SMTP,域名解析DNS,檔案下載下傳FTP協定,遠端協助

Telnet協定,超文本傳輸HTTP等等。

運輸層:主要為兩台主機上的應用提供端到端的通信。TCP協定和UDP協定。

網絡層:在複雜的網絡環境中為要發送的資料報找到一個合适的路徑進行傳輸。(IP選址、路由選擇)。

鍊路層:用來處理連結網絡的硬體部分,包括控制作業系統、驅動、網卡等等。

TCP是四層模型?

第一層:應用層,主要有負責web浏覽器的HTTP協定, 檔案傳輸的FTP協定,負責電子郵件的SMTP協定,負責域名系統的DNS等。

第二層:傳輸層,主要是有可靠傳輸的TCP協定,特别高效的UDP協定。主要負責傳輸應用層的資料包。

第三層:網絡層,主要是IP協定。主要負責尋址(找到目标裝置的位置)

第四層:資料鍊路層,主要是負責轉換數字信号和實體二進制信号。

TCP和UDP的差別

Mybatis高頻面試題——計算機網絡

TCP與UDP差別總結:

1、TCP面向連接配接(如打電話要先撥号建立連接配接);UDP是無連接配接的,即發送資料之前不需要建立連接配接。

2、TCP提供可靠的服務。也就是說,通過TCP連接配接傳送的資料,無差錯,不丢失,不重複,且按序到達;UDP盡最大努力傳遞,即不保證可靠傳遞。

3、TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流;UDP是面向封包的。UDP沒有擁塞控制,是以網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視訊會議等)。

4、每一條TCP連接配接隻能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通信。

5、TCP首部開銷20位元組;UDP的首部開銷小,隻有8個位元組。

6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道。