Mybatis面試題打卡(持續更新)

少年長大了,是時候面臨實習工作了,根據之前所學,從今天開始面試題打卡,希望能夠堅持下去吧(每天記下來的打個勾). 因爲課程還在繼續,所以明天加油吧.

1.Mybatis是什麼?
mybatis是一個持久層ORM框架。它內部封裝了jdbc,使得開發更簡潔,更高效。
Mybatis使開發者只需要關注sql語句本身,簡化JDBC操作,不需要在關注加載驅動、創建連接、處理SQL語句等繁雜的過程。
MyBatis可以通過xml或註解完成ORM映射關係配置。

2.Mybatis和JDBC的關係?
JDBC是Java提供的一個操作數據庫的API; MyBatis是一個持久層ORM框架,底層是對JDBC的封裝。
MyBatis對JDBC操作數據庫做了一系列的優化:
(1) mybatis使用已有的連接池管理,避免浪費資源,提高程序可靠性。
(2) mybatis提供插件自動生成DAO層代碼,提高編碼效率和準確性。
(3)mybatis 提供了一級和二級緩存,提高了程序性能。
(4) mybatis使用動態SQL語句,提高了SQL維護。(此優勢是基於XML配置)
(5) mybatis對數據庫操作結果進行自動映射

3.什麼是ORM?
ORM的全稱是Object Relational Mapping,即對象關係映射。
描述的是對象和表之間的映射。操作Java對象,通過映射關係,就可以自動操作數據庫。
在ORM關係中,數據庫表對應Java中的類,一條記錄對應一個對象,一個屬性對應一個列。
常見的ORM框架:Mybatis、Hibernate

4.MyBatis的兩種配置方式?
註解、XML

5.Mybatis中#{}和${}的區別是什麼?
1.#{}實現的是sql語句的預處理參數,之後再sql中用?號代替,使用時不需要關注數據類型,Mybatis自動實現數據類型的轉換,並且可以防止SQL注入;
2. $ {}實現的是sql語句的直接拼接,不做數據類型轉換,需要自行判斷數據類型,不能防止SQL注入;
3.在某些特定情況下必須使用sql,使{},如:在分表存儲的情況下,對哪張表的查詢是不確定的,也就是sql語句不能寫死,表明是動態的,查詢條件是固定的,此時表明只能使用{}方式進行字符串拼接,這樣:slect * from ${tableName} where id = #{id}

總結:#{}佔位符,用於參數傳遞; ${}用於SQL拼接

6.使用Mybatis過程中當實體類中的屬性名和表中的字段名不一樣 ,怎麼解決?
1. 通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致
2.使用通用Mapper時,可以通過@Column註解設置
3.如果進行自定義查詢,可以通過@Result進行設置

7.模糊查詢like語句該怎麼寫?
1.使用通用Mapper的Criteria進行like語句的拼湊
2.使用#{}佔位符方式,參數前後拼湊%。(select * from t_user where username like #{username} ,username數據爲"%jack%")

8.編寫了一個Dao接口,提供需要的方法,在方法添加對應的註解就可以完成對應的功能,工作原理是什麼?
Dao接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理爲Dao接口生成代理proxy對象,代理對象proxy會攔截接口方法,轉而執行接口方法所對應的MappedStatement所代表的sql,然後將sql執行結果返回。

MappedStatement解釋:MappedStatement維護了一條<select|update|delete|insert>節點的封裝,包括了傳入參數映射配置、執行的SQL語句、結果映射配置等信息。如以下一個節點

select id, username from author where id = #{value}

9.使用Mybatis時Dao接口裏的方法能重載嗎?
不能重載的,
因爲是全限定名+方法名的必須唯一。

10.Mybatis是如何進行分頁的?
使用第三方分頁助手:PageHelper
使用方式:
在將要執行查詢sql語句之前使用分頁助手:PageHelper.startPage(pageNum:頁碼, pageSize:每頁顯示數量);

11.Mybatis分頁插件的原理是什麼?
使用MyBatis插件(也稱爲攔截器)機制,對需要使用分頁的功能進行增強。也就是重寫SQL,根據不同的數據庫生產不同的分頁語句。
Mysql生成limit語句,Oracle藉助rownum生產對應子查詢語句。

12.Mybatis是如何將sql執行結果封裝爲目標對象的?
提供POJO和表之間的映射關係,查詢結果就可以完成封裝。
1.使用通用Mapper,需要在POJO上字段上使用@Column註解
2.如果是自定義查詢,需要通過Dao接口裏使用@Result註解
3.如果是xml,需要使用配置映射關係

13.Mybatis動態sql標籤有那些?
動態SQL標籤主要是基於XML進行配置的,在校主要學習的是註解,沒有使用過XML。
不過註解也支持部分動態標籤,@Select("
")

14.Mybatis與Hibernate區別在哪裏?
Hibernate是全自動的ORM框架,也就是使用hibernate不用編寫任何SQL語句。關聯對象直接調用對應方法,可以自動完成數據的查詢。
MyBatis封裝了JDBC基本操作,但仍需要編寫SQL語句,也稱爲半自動ORM框架。使用通過Mapper可以簡化MyBatis單表操作,多表仍需要自己編寫SQL語句。

15.【瞭解】一個Xml映射文件,都會寫一個Dao接口與之對應,這個Dao接口的工作原理是什麼?
Dao接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理爲Dao接口生成代理proxy對象,代理對象proxy會攔截接口方法,轉而執行接口方法所對應的MappedStatement所代表的sql,然後將sql執行結果返回。

MappedStatement解釋:MappedStatement維護了一條<select|update|delete|insert>節點的封裝,包括了傳入參數映射配置、執行的SQL語句、結果映射配置等信息。如以下一個節點

select id, username from author where id = #{value}

16.【瞭解】Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重複?
不同的Xml映射文件,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複。
MyBatis通過namespace+id來進行不同XML標識。

17.【瞭解】解釋一下MyBatis中命名空間(namespace)的作用。
namespace用於標識不同的XML配置文件。這樣不同xml文件中sql語句的id相同也不會有衝突。
註解開發沒有類似要求,只要保證接口全限定名不同即可(包+類名)

18.【瞭解】MyBatis中的動態SQL是什麼意思?
在xml配置文件,根據數據的不同,動態拼湊對應的SQL語句。
例如:
用於處理條件成立時顯示部分SQL語句
如果有條件就顯示 where 子句,如果沒有條件則不顯示。

18.【瞭解】Mybatis的緩存機制
Mybatis的緩存機制分爲一級緩存和二級緩存
1.一級緩存:一級緩存的作用域是sqlSession會話級,相當於JDBC的Connection連接。一級緩存默認開啓,用戶不能手動配置。當在同一個sqlSession中執行兩次相同的sql語句時,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次查詢時會從緩存中獲取數據,不再去底層數據庫查詢,從而提高查詢效率;
2.二級緩存:二級緩存的作用域爲同一個mapper的namespace,是跨sqlSession的,同一個namespace中不同的查詢SQL可以從二級緩存中命中。二級緩存默認關閉,但是可以通過配置進行開啓。
二級緩存的對象必須序列化,例如:User對象必須實現Serializable接口。

Mybatis中,執行select時,查詢數據會被緩存;當執行insert、update、delete等操作的時候,緩存則會被清除

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