更新時間:2022-12-14 16:44:20 來源:動力節點 瀏覽1408次
mybatis是一個優秀的基于Java持久層框架,內部它是封裝了JDBC,讓開發者不用過多的關心什么創建連接、加載驅動啊等等。如今大企業越來越多用mybatis,為什么它越來越被廣泛應用,以前流行的SSH框架開發,而現在完全勢向于SSM框架開發,今天講解mybatis框架常見面試題。
● 談一談你對ORM的理解?
對象關系映射(Object Relational Mapping,簡稱ORM)是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術。 簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將java程序中的對象自動持久化到關系數據庫中。當然反過來也是可以的,例如將數據庫表當中的記錄查詢出來,然后映射為Java程序中的Java對象。
● 在MyBatis中$和#的區別?
$進行sql語句的拼接,#是專門給sql語句傳值的。$就是JDBC當中的Statement,#就是JDBC當中的PreparedStatement。$的這種方式使用時需要特別注意sql注入問題。
● 你對MyBatis的一級緩存和二級緩存有了解嗎,說一下?
Mybatis對緩存提供支持,但是在沒有配置的默認情況下,它只開啟一級緩存,一級緩存只是相對于同一個SqlSession而言。所以在參數SQL完全一樣的情況下,我們使用同一個SqlSession對象調用一個Mapper方法,往往只執行一次SQL,因為使用SqlSession第一次查詢后,MyBatis會將其放在緩存中,以后再查詢的時候,如果沒有聲明需要刷新,并且緩存沒有超時的情況下,SqlSession都會取出當前緩存的數據,而不會再次發送SQL到數據庫。
MyBatis的二級緩存是Application級別的緩存,它可以提高對數據庫查詢的效率,以提高應用的性能。SqlSessionFactory層面上的二級緩存默認是不開啟的,二級緩存的開啟需要進行配置,實現二級緩存的時候,MyBatis要求返回的POJO必須是可序列化的。 也就是要求實現Serializable接口,配置方法很簡單,只需要在映射XML文件配置就可以開啟緩存了。
由于我們在實際的開發中目前都會使用第三方的緩存技術,例如Redis,所以MyBatis這塊的二級緩存沒有太多的了解。
● MyBatis的parameterType怎么理解的?
parameterType屬性用來指定參數類型,parameterType屬性是專門用來給sql語句占位符#{}傳值的,底層原理使用了反射機制,#{}的大括號當中需要提供實體類的屬性名,底層使用屬性名拼接get方法來獲取屬性值,將屬性值傳遞給sql語句。
● MyBatis的resultType是怎么理解的?
resultType用來指定結果集封裝的數據類型,當一個select語句查詢之后得到結果集,結果集的列名需要和java實體類的屬性名一致,不一致的可以使用as關鍵字給列起別名,拿著列名拼接set方法,通過反射機制調用set方法給結果集對象的屬性賦值。
● MyBatis中resultMap用過嗎,它是干什么的?
在MyBatis當中,查詢結果集被封裝為Java對象,可以通過resultType,也可以通過resultMap,在resultMap當中描述了數據庫表的列與Java對象的屬性之間的對應關系。在映射關系中,還可以通過resultMap的typeHandler設置實現查詢結果值的類型轉換。另外,最重要的是通過resultMap的子標簽比如、等,可以實現一對一、一對多等的映射。
● MyBatis底層實現原理?
MyBatis是一個持久層框架,實現了ORM思想,可以將查詢的結果集自動轉換成Java對象,也可以將Java對象轉換成一條數據插入到數據庫表當中。
那么,查詢結果集是如何自動轉換成Java對象的呢?實際上這里使用了反射機制,在配置文件中假設編寫了一條select語句,查詢之后,列名與屬性名要一一對應(不對應的可以采用給列起別名),然后每個列名前添加“set”,通過反射機制獲取set方法,然后再通過反射機制的method.invoke()來調用這個set方法,給Java對象的屬性賦值。這樣就完成了對象的封裝。
另外,Java對象是如何轉換成一條記錄插入到數據庫的呢?假設在配置文件中編寫了一條insert語句,那么這條語句需要的值從哪里來呢,在mybatis的mapper配置中有parameterType屬性,該屬性是專門給sql語句占位符傳值的,其實這里也是使用了反射機制,其中sql語句的占位符采用#{},其中大括號當中需要提供java對象的屬性名,該屬性名和get進行拼接得到get方法名,然后通過反射機制獲取該get方法,再通過method.invoke()來調用這個get方法,這樣就可以獲取到對應的屬性值,然后傳入了。
其實MyBatis設計最牛的地方當然是采用JDK動態代理的方式生成DAO接口的實現類了。其中DAO接口中的每一個方法名對應sql語句的id。DAO接口中的方法不允許重載,因為id是不允許重復的。以上大概就是我了解的MyBatis實現原理。
以上就是“被問到很多次的mybatis面試題及答案”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習