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 的優點:
-
易於上手和掌握。
-
sql寫在xml裏,便於統一管理和優化。
-
解除sql與程序代碼的耦合。
-
提供映射標籤,支持對象與數據庫的orm字段關係映射
-
提供對象關係映射標籤,支持對象關係組建維護
-
提供xml標籤,支持編寫動態sql。
3、MyBatis 框架的缺點:
-
sql工作量很大,尤其是字段多、關聯表多時,更是如此。
-
sql依賴於數據庫,導致數據庫移植性差。
-
由於xml裏標籤id必須唯一,導致DAO中方法不支持方法重載。
-
字段映射標籤和對象關係映射標籤僅僅是對映射關係的描述,具體實現仍然依賴於sql。(比如配置了一對多Collection標籤,如果sql裏沒有join子表或查詢子表的話,查詢後返回的對象是不具備對象關係的,即Collection的對象爲null)
-
DAO層過於簡單,對象組裝的工作量較大。
-
不支持級聯更新、級聯刪除。
-
編寫動態sql時,不方便調試,尤其邏輯複雜時。
-
若不查詢主鍵字段,容易造成查詢出的對象有“覆蓋”現象。
-
參數的數據類型支持不完善。(如參數爲Date類型時,容易報沒有get、set方法,需在參數上加@param)
-
多參數時,使用不方便,功能不夠強大。(目前支持的方法有map、對象、註解@param以及默認採用012索引位的方式)
-
緩存使用不當,容易產生髒數據。
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語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致。
方法二:通過來映射字段名和實體類屬性名的一一對應的關係
在這裏插入圖片描述