【mybatis】mybatis面試題
mybatis的基本工作流程
1.讀取配置檔案,配置檔案包含資料庫連線資訊和Mapper對映檔案或者Mapper包路徑。
2.有了這些資訊就能建立SqlSessionFactory,SqlSessionFactory的生命週期是程式級,程式執行的時候建立起來,程式結束的時候消亡
3.SqlSessionFactory建立SqlSession,目的執行sql語句,SqlSession是過程級,一個方法中建立,方法結束應該關閉
4.當用戶使用mapper.xml檔案中配置的的方法時,mybatis首先會解析sql動態標籤為對應資料庫sql語句的形式,並將其封裝進MapperStatement物件,然後通過executor將sql注入資料庫執行,並返回結果。
5.將返回的結果通過對映,包裝成java物件。
什麼是MyBatis的介面繫結,有什麼好處
介面對映就是在IBatis中任意定義介面,然後把接口裡面的方法和SQL語句繫結,我們通過直接呼叫介面方法 例如:
UserMapper userMapper=sqlSession.getMapper (UserMapper.class) 就可以,這樣比起原來了SqlSession提供的方法,例如List<Country> countryList = sqlSession.selectList("selectAll");我們可以有更加靈活的選擇和設定.。
注意:(1)Mapper .xml檔案的namespace屬性必須配置為介面的全限定名稱,介面方法名與Mapper.xml中的<select><insert>id值必須相同,且介面方法的返回值型別必須與Mapper.xml配置的resultType一致,這裡後者起到決定作用。
(2)select查詢通過在Mapper.xml中配置ResultMap標籤,將查詢結果的列名與欄位名對應。
insert語句通過#{屬性名}從介面引數獲取值放到sql語句中。
(3)Mapper.xml介面繫結本質是動態代理。
介面繫結有幾種實現方式,分別是怎麼實現的?
介面繫結有兩種實現方式,
(1)註解繫結:就是在介面的方法上面@[email protected]等註解裡面包含Sql語句來繫結
(2)另外一種就是通過xml裡面寫SQL來繫結,在這種情況下,要指定xml對映檔案裡面的namespace必須為介面的全路徑名.
什麼情況下用註解繫結,什麼情況下用xml繫結
當Sql語句比較簡單時候,用註解繫結,
當SQL語句比較複雜時候,用xml繫結,一般用xml繫結的比較多
MyBatis實現一對一有幾種方式?具體怎麼操作的
有聯合查詢和巢狀查詢
(1)聯合查詢是幾個表聯合查詢,只查詢一次,
查詢結果有三種處理方式:第一種自動對映返回結果為resultType、
第二種配置resultMap,返回結果配置為存在的resultMap,這個resultMap中的Property都要加一個role.Property,表示使用者物件中的role物件的property,每一個屬性都要加role.很繁瑣,association標籤就是解決這個問題的。
第三種通過在resultMap裡面配置association節點配置一對一的類就可以完成;
注意:mybaits支援resultMap對映繼承。<ResultMap id="userRoleMap" extends="userMap">
(2)巢狀查詢是先查一個表,根據這個表裡面的結果的外來鍵id,去再另外一個表裡面查詢資料,也是通過association配置,但另外一個表的查詢通過select屬性配置
MyBatis實現一對多有幾種方式,怎麼操作的
有聯合查詢和巢狀查詢
(1)聯合查詢是幾個表聯合查詢,只查詢一次,通過在resultMap裡面配置collection標籤配置一對多的類就可以完成;
(2)巢狀查詢是先查一個表,根據這個表裡面結果的外來鍵id,去再另外一個表裡面查詢資料,也是通過配置collection,但另外一個表查詢通過select節點配置
MyBatis裡面的動態Sql是怎麼設定的?用什麼語法?
MyBatis裡面的動態Sql一般是通過if節點來實現,通過OGNL語法來判斷,但是如果要寫的完整,必須配合where,trim節點,
choose標籤 choose when otherwise標籤,一個choose中至少有一個when,0或1個otherwise,如果when滿足就執行,全不滿足就執行otherwise。
注意where1=1必須新增,防止where關鍵字後面沒有語句.
where標籤是判斷包含節點有內容就插入where,如果where後面的字串是以AND和OR開頭的,就將AND和OR提出
當if條件都不滿足,where元素中沒有內容,也就不會出現choose標籤那種錯誤。
set標籤更新的時候用:如果該標籤包含的元素中有返回值,就插入一個set;如果set後面的字串是以逗號結尾的,就將這個逗號剔除。
注意set標籤用法中,SQL後面的逗號沒有問題了,但是如果set元素中沒有內容,照樣會出現SQL錯誤,所以為了避免錯誤產生,類似id=#{id}這樣必然存在的賦值仍然有保留的必要。
講下MyBatis的快取
MyBatis的快取分為一級快取和二級快取,
一級快取放在session裡面,預設就有,二級快取放在它的名稱空間裡,預設是開啟的,
使用二級快取屬性類需要實現Serializable序列化介面(可用來儲存物件的狀態),可在它的對映檔案中配置<cache/>