mybatis面試題

零零快乐發表於2024-05-09

MyBatis

  1. MyBatis基本要素:
    ·configuration.xml 全域性配置檔案【SqlMapConfig.xml檔案】
    · xml對映檔案(mapper)—實體類
    ·SqlSession介面

2.mybatis的主要執行流程?

mybatis配置檔案,包括Mybatis全域性配置檔案和Mybatis對映檔案,其中全域性配置檔案配置了資料來源、事務等資訊;對映檔案配置了SQL執行相關的 資訊。
mybatis透過讀取配置檔案資訊(全域性配置檔案和對映檔案),構造出SqlSessionFactory,即會話工廠。
透過SqlSessionFactory,可以建立SqlSession即會話。Mybatis是透過SqlSession來運算元據庫的。
SqlSession本身不能直接運算元據庫,它是透過底層的Executor執行器介面來運算元據庫的。Executor介面有兩個實現類,一個是普通執行器,一個是快取執行器(預設)。
Executor執行器要處理的SQL資訊是封裝到一個底層物件MappedStatement中。
該物件包括:SQL語句、輸入引數對映資訊、輸出結果集對映資訊。其中輸入引數和輸出結果的對映型別包括java的簡單型別、HashMap集合物件、POJO物件型別。
3、MyBatis的生命週期
Mybatis元件生命週期如圖所示:

1、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder的作用在於建立SqlSessionFactory,建立成功後,SqlSessionFactoryBuilder就失去作用,所以它只能存在於建立SqlSessionFactory的方法中,而不要讓其長期存在。

2、SqlSessionFactory
SqlSessionFactory可以被認為是一個資料庫連線池,它的作用是建立SqlSession介面物件。因為MyBatis的本質就是Java對資料庫的操作,所以SqlSessionFactory的生命週期存在於整個MyBatis的應用中,所以一旦建立了SqlSessionFactory,就要長期儲存它,直至不在使用MyBatis應用,所以可以認為SqlSessionFactory的生命週期就等同與MyBatis的應用週期。

由於SqlSessionFactory是對一個資料庫的連線池,所以它佔據著資料庫的連線資源。如果建立多個SqlSessionFactory,那麼就存在多個資料庫連線池,不利於對資料庫資源的控制,也將導致資料庫連線資源被消耗光,出現系統當機等情況,所以儘量避免出現這種情況。因此在一般的應用中,我們往往希望SqlSessionFactory作為一個單例,讓它在應用中被共享。

3、SqlSession
如果說SqlSessionFactory相當於資料庫連線池,那麼SqlSession就相當於一個資料庫連線(Connection物件),我們可以在一個事務中執行多條SQL,然後透過它的commit、rollback等方法,提交或回滾事務。所以SqlSession應該存活在一個業務請求中,處理完整個請求後,應該關閉這條連線,讓它歸還給SqlSessionFactory,否則資料庫資源將被耗光,系統癱瘓,所以使用try...catch...finally語句來保證SqlSession正確關閉。

4、Mapper
Mapper是一個介面,它由SqlSession所建立,所以它的最大生命週期至多和SqlSession保持一致,當SqlSession關閉時,Mapper的資料庫連線資源也會消失,所以Mapper的生命週期應該小於等於SqlSession的生命週期。Mapper代表的是一個請求中的業務處理,所以它應該在一個請求中,一旦處理完了相關業務,就應該廢棄它。

{} 和 ${} 的區別?
·#{}是佔位符,進行預編譯處理,${}是字串替換,不進行預編譯處理。
·Mybatis 在處理時,#{}傳入引數是以字串傳入,會將 SQL 中的#{}替換為?號,呼叫 PreparedStatement 的 set 方法來賦值。
·#{} 可以有效的防止 SQL 注入,提高系統安全性;${} 不能防止 SQL 注入
·#{} 的變數替換是在 DBMS 中;${} 的變數替換是在 DBMS 外

5.在mybatis中,resultType和resultMap的區別是什麼?
·當資料庫結果集的列名與封裝實體的屬性名一致的話使用result Type屬性
·當資料庫結果集的列名與封裝實體的屬性名不一致的情況使用resultMap屬性,透過resultMap手動建立物件關係對映,要配置表和類的一一對應關係。即表的欄位名和實體類的屬性名可以不一樣。

6.mybatis中你知道的動態SQL的標籤有哪些?分別的作用是什麼?
·if用作判斷
·where標籤可以用來做動態拼接查詢條件,和if標籤配合的時候不用顯示的宣告型別。
·foreach標籤對傳入的集合進行遍歷,然後把每一項的內容作為引數傳到SQL語句。
·set標籤主要用在動態更新的時候,進行校驗
·includ標籤減少重複程式碼的編寫。

7.說一下 MyBatis 的一級、二級快取?
這個問題比較複雜,我們可以從幾個方面來說明一下:
·首先mybatis裡面設計了二級快取機制來提升資料的一個檢索效率,避免每一次資料的檢索都去查詢資料庫。
·一級快取是SQL Session級別的一個快取,也叫本地快取,因為每一個使用者在執行查詢的時候都需要使用SQL Session來執行,為了避免每一次資料的檢索都去查詢資料庫,mybatis把查詢出來的資料快取到SQL Session的本地快取裡面,後續的SQL如果在命中快取的情況下就可以直接在本地快取中取,如果想實現跨SQL Session級別的一個快取,那麼一級快取是無法做到的,所以引入了二級快取的一個設計。
·當多個使用者在查詢資料的時候只要有如何一個SQL Session拿到了資料,就會放到二級快取裡面去,其他的SQL Session就可以在二級快取裡面去載入資料。
實現原理:
·一級快取:在SQL Session裡面會持有一個Executor,每一個Executor裡面會有一個叫Local Cache的一個物件,當使用者發起查詢的時候,mybatis會根據執行語句在Local Cache裡面去查詢,如果名中了就直接把這個資料返回,如果沒有則去資料庫裡面查詢出來,再寫到Local Cache裡面去。
·二級快取:在一級快取的Executor上去做了一個裝飾,引入了叫Caching Executor的裝飾器,在進入一級快取的查詢之前會先透過Caching Executor進行二級快取的查詢,開啟二級快取之後會被多個SQL Session共享,即是一個全域性的快取,查詢流程就變成了先查二級快取--->一級快取---->資料庫。

相關文章