MyBatis常見面試題整理

MyBatis 面試題

1、什麼是 Mybatis?

2、Mybaits 的優點:

3、MyBatis 框架的缺點:

4、MyBatis 框架適用場合:

5、MyBatis 與 Hibernate 有哪些不同?

6、#{}和${}的區別是什麼?

7、當實體類中的屬性名和表中的字段名不一樣 ,怎麼辦 ?

8、 模糊查詢 like 語句該怎麼寫?


1、什麼是 Mybatis?

mybatis是一個優秀的基於java的持久層框架,它內部封裝了jdbc,使開發者只需要關注sql語句本身,而不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的過程。

mybatis通過xml或註解的方式將要執行的各種statement配置起來,並通過java對象和statement中sql的動態參數進行映射生成最終執行的sql語句,最後由mybatis框架執行sql並將結果映射爲java對象並返回。

2、Mybaits 的優點:

  1. 易於上手和掌握。

  2. sql寫在xml裏,便於統一管理和優化。

  3. 解除sql與程序代碼的耦合。

  4. 提供映射標籤,支持對象與數據庫的orm字段關係映射

  5. 提供對象關係映射標籤,支持對象關係組建維護

  6. 提供xml標籤,支持編寫動態sql。

3、MyBatis 框架的缺點:

  1. sql工作量很大,尤其是字段多、關聯表多時,更是如此。

  2. sql依賴於數據庫,導致數據庫移植性差。

  3. 由於xml裏標籤id必須唯一,導致DAO中方法不支持方法重載。

  4. 字段映射標籤和對象關係映射標籤僅僅是對映射關係的描述,具體實現仍然依賴於sql。(比如配置了一對多Collection標籤,如果sql裏沒有join子表或查詢子表的話,查詢後返回的對象是不具備對象關係的,即Collection的對象爲null)

  5. DAO層過於簡單,對象組裝的工作量較大。

  6. 不支持級聯更新、級聯刪除。

  7. 編寫動態sql時,不方便調試,尤其邏輯複雜時。

  8. 若不查詢主鍵字段,容易造成查詢出的對象有“覆蓋”現象。

  9. 參數的數據類型支持不完善。(如參數爲Date類型時,容易報沒有get、set方法,需在參數上加@param)

  10. 多參數時,使用不方便,功能不夠強大。(目前支持的方法有map、對象、註解@param以及默認採用012索引位的方式)

  11. 緩存使用不當,容易產生髒數據。

4、MyBatis 框架適用場合:

MyBatis是一個半映射的框架,它也支持緩存,級聯等操作,缺點就在於需要你提供映射規則和SQL,
工作量比Hibernate要大。MyBatis雖然開發不如Hibernate效率高,但是其靈活,可SQL優化的特點很
吸引人,正因爲此,在於大數據,高併發移動互聯網項目中較爲常用。

5、MyBatis 與 Hibernate 有哪些不同?

1、開發方面
        在項目開發過程當中,就速度而言:
            hibernate開發中,sql語句已經被封裝,直接可以使用,加快系統開發;
            Mybatis 屬於半自動化,sql需要手工完成,稍微繁瑣;
        但是,凡事都不是絕對的,如果對於龐大複雜的系統項目來說,發雜語句較多,選擇hibernate 就不是一個好方案。
2、 sql優化方面
        Hibernate 自動生成sql,有些語句較爲繁瑣,會多消耗一些性能;
        Mybatis 手動編寫sql,可以避免不需要的查詢,提高系統性能;
2、對象管理比對
        Hibernate 是完整的對象-關係映射的框架,開發工程中,無需過多關注底層實現,只要去管理對象即可;
        Mybatis 需要自行管理 映射關係;

6、#{}和${}的區別是什麼?

 #{}: 解析爲一個 JDBC 預編譯語句(prepared statement)的參數標記符,一個 #{ } 被解析爲一個參數佔位符 。
 ${}: 僅僅爲一個純碎的 string 替換,在動態 SQL 解析階段將會進行變量替換。

 1 #是將傳入的值當做字符串的形式,eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到後臺的時候,就相當於 select id,name,age from student where id ='1'.

 2 $是將傳入的數據直接顯示生成sql語句,eg:select id,name,age from student where id =${id},當前端把id值1,傳入到後臺的時候,就相當於 select id,name,age from student where id = 1.

 3 使用#可以很大程度上防止sql注入。(語句的拼接)

 4 但是如果使用在order by 中就需要使用 $.

 5 在大多數情況下還是經常使用#,但在不同情況下必須使用$. 

7、當實體類中的屬性名和表中的字段名不一樣 ,怎麼辦 ?

方法一:通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致。
在這裏插入圖片描述
方法二:通過來映射字段名和實體類屬性名的一一對應的關係
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章