阿里最新38道Java面試題解析(MyBatis+訊息佇列+Redis)

程式設計師追風發表於2019-10-14

一、談談你對 MyBatis 的理解?

1. Mybatis是一個半ORM(物件關係對映)框架,它內部封裝了 JDBC,開發時只需要關注 SQL 語句本身,不需要花費精力去處理載入驅動、建立連線、建立 Statement 等繁雜的過程。程式設計師直接編寫原生態 SQL,可以嚴格控制 SQL 執行效能,靈活度高。

2. MyBatis 可以使用 XML 或註解來配置和對映原生資訊,將 POJO 對映成資料庫中的記錄,避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。

3. 通過 XML 檔案或註解的方式將要執行的各種 Statement 配置起來,並通過 Java 物件和 Statement 中 SQL 的動態引數進行對映生成最終執行的 SQL 語句,最後由 MyBatis 框架執行 SQL並將結果對映為 Java 物件並返回。(從執行 SQL到返回 Result 的過程)。

阿里最新38道Java面試題解析(MyBatis+訊息佇列+Redis)

二、MyBaits 的優缺點有哪些?

§ 優點:

1. 基於 SQL 語句程式設計,相當靈活,不會對應用程式或者資料庫的現有設計造成任何影響,SQL 寫在 XML 裡,解除 SQL 與程式程式碼的耦合,便於統一管理;提供XML標籤,支援編寫動態 SQL 語句,並可重用;
2. 與 JDBC 相比,減少了程式碼量,消除了 JDBC 大量冗餘的程式碼,不需要手動開關連線;
3. 很好的與各種資料庫相容(因為 MyBatis 使用 JDBC 來連線資料庫,所以只要 JDBC 支援的資料庫 MyBatis 都支援);
4. 提供對映標籤,支援物件與資料庫的 ORM 欄位關係對映;提供物件關係對映標籤,支援物件關係元件維護。

§ 缺點:

1. SQL 語句的編寫工作量較大,尤其當欄位多、關聯表多時,對開發人員編寫 SQL 語句的功底有一定要求;
2. SQL 語句依賴於資料庫,導致資料庫移植性差,不能隨意更換資料庫。

三、MyBatis 與 Hibernate 有哪些不同?

1. MyBatis 和 Hibernate不同,它不完全是一個 ORM 框架,因為 MyBatis 需要程式設計師自己編寫 SQL 語句;Hibernate 物件/關係對映能力強,資料庫無關性好,對於關係模型要求高的軟體,如果用 Hibernate 開發可以節省很多程式碼,提高效率;

2. MyBatis 直接編寫原生態 SQL,可以嚴格控制 SQL 執行效能,靈活度高,非常適合對關係資料模型要求不高的軟體開發,因為這類軟體需求變化頻繁,一但需求變化要求迅速輸出成果。但是靈活的前提是 MyBatis 無法做到資料庫無關性,如果需要實現支援多種資料庫的軟體,則需要自定義多套 SQL 對映檔案,工作量大。

四、MyBatis 中 #{} 和 ${}的區別是什麼?

§ #{} 是預編譯處理,${} 是字串替換
1. Mybatis 在處理 #{} 時,會將 SQL 中的 #{} 替換為 ? 號,呼叫 PreparedStatement 的 set 方法來賦值;使用 #{} 可以有效的防止 SQL 注入,提高系統安全性;

2. MyBatis 在處理 ${} 時,就是把 ${} 替換成變數的值。

五、MyBatis 是如何進行分頁的?分頁外掛的原理是什麼?

MyBatis 使用 RowBounds 物件進行分頁,它是針對 ResultSet 結果集執行的記憶體分頁,而非物理分頁。可以在 SQL 內直接書寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁外掛來完成物理分頁。
分頁外掛的基本原理是使用 MyBatis 提供的外掛介面,實現自定義外掛,在外掛的攔截方法內攔截待執行的 SQL,然後重寫 SQL,根據 dialect 方言,新增對應的物理分頁語句和物理分頁引數。

六、MyBatis 有幾種分頁方式?

1. 陣列分頁
2. SQL 分頁
3. 攔截器分頁
4. RowBounds 分頁

七、MyBatis 邏輯分頁和物理分頁的區別是什麼?

1. 物理分頁速度上並不一定快於邏輯分頁,邏輯分頁速度上也並不一定快於物理分頁。
2. 物理分頁總是優於邏輯分頁:沒有必要將屬於資料庫端的壓力加到應用端來,就算速度上存在優勢,然而其它效能上的優點足以彌補這個缺點。

八、MyBatis 是否支援延遲載入?如果支援,它的實現原理是什麼?

Mybatis 僅支援 association 關聯物件和 collection 關聯集合物件的延遲載入,association 指的就是一對一,collection 指的就是一對多查詢。在MyBatis配置檔案中,可以配置是否啟用延遲載入lazyLoadingEnabled=true|false。
它的原理是,使用 CGLIB 建立目標物件的代理物件,當呼叫目標方法時,進入攔截器方法,比如呼叫 a.getB().getName(),攔截器 invoke() 方法發現 a.getB() 是 null 值,那麼就會單獨傳送事先儲存好的查詢關聯 B 物件的 SQL,把 B 查詢上來,然後呼叫 a.setB(b),於是 a 的物件 b 屬性就有值了,接著完成 a.getB().getName() 方法的呼叫。這就是延遲載入的基本原理。

九、說一下 MyBatis 的一級快取和二級快取?

一級快取:基於 PerpetualCache 的 HashMap 本地快取,其儲存作用域為 Session,當 Session flush 或 close 之後,該 Session 中的所有 Cache 就將清空,預設開啟一級快取;
二級快取:與一級快取其機制相同,預設也是採用 PerpetualCache,HashMap 儲存,不同在於其儲存作用域為 Mapper(Namespace),並且可自定義儲存源,如 Ehcache。預設不開啟二級快取,要開啟二級快取,使用二級快取屬性類需要實現 Serializable 序列化介面(可用來儲存物件的狀態),可在它的對映檔案中配置 <cache/> ;
對於快取資料更新機制,當某一個作用域(一級快取 Session / 二級快取 Namespaces)的進行了 C/U/D 操作後,預設該作用域下所有 select 中的快取將被 clear。

十、Mybatis 有哪些執行器(Executor)?

Mybatis 有 3 種基本的執行器(Executor):
1. SimpleExecutor:每執行一次 update 或 select,就開啟一個 Statement 物件,用完立刻關閉 Statement 物件;

2. ReuseExecutor:執行 update 或 select,以 SQL 作為 key 查詢 Statement 物件,存在就使用,不存在就建立,用完後,不關閉 Statement 物件,而是放置於 Map 內,供下一次使用。簡言之,就是重複使用 Statement 物件;

3. BatchExecutor:執行 update(沒有 select,JDBC 批處理不支援select),將所有 SQL 都新增到批處理中(addBatch()),等待統一執行(executeBatch()),它快取了多個 Statement 物件,每個 Statement對 象都是 addBatch() 完畢後,等待逐一執行 executeBatch() 批處理。與 JDBC 批處理相同。

十一、MyBatis 動態 SQL 是做什麼的?都有哪些動態 SQL?能簡述一下動態 SQL的執行原理不?

1. MyBatis 動態 SQL 可以讓我們在 XML 對映檔案內,以標籤的形式編寫動態 SQL,完成邏輯判斷和動態拼接 SQL 的功能;

2. MyBatis 提供了 9 種動態 SQL 標籤:trim、where、set、foreach、if、choose、when、otherwise、bind;

3. 執行原理:使用 OGNL 從 SQL 引數物件中計算表示式的值,根據表示式的值動態拼接 SQL,以此來完成動態 SQL 的功能。
阿里最新38道Java面試題解析(MyBatis+訊息佇列+Redis)

訊息佇列面試題

1、訊息佇列的基本作用?
2、訊息佇列的優缺點有哪些?
3、如何保證訊息佇列的高可用?
4、如何保證訊息不被重複消費?或者說,如何保證訊息消費的冪等性?
5、如何保證訊息的可靠性傳輸?或者說,如何處理訊息丟失的問題?
6、如何保證訊息的順序性?
7、大量訊息在 MQ 里長時間積壓,該如何解決?
8、MQ 中的訊息過期失效了怎麼辦?
9、RabbitMQ 有哪些重要的角色?
10、RabbitMQ 有哪些重要的元件?
11、RabbitMQ 有幾種廣播型別?
12、Kafka 可以脫離 zookeeper 單獨使用嗎?為什麼?
13、Kafka 有幾種資料保留的策略?
14、Kafka 的分割槽策略有哪些?
阿里最新38道Java面試題解析(MyBatis+訊息佇列+Redis)

Redis面試題

1、談下你對 Redis 的瞭解?
2、Redis 一般都有哪些使用場景?
3、Redis 有哪些常見的功能?
4、Redis 支援的資料型別有哪些?
5、Redis 為什麼是單執行緒的?
6、Redis 為什麼這麼快?
7、什麼是快取穿透?怎麼解決?
8、什麼是快取雪崩?該如何解決?
9、 怎麼保證快取和資料庫資料的一致性?
10、Redis 持久化有幾種方式?
11、Redis 怎麼實現分散式鎖?
12、Redis 淘汰策略有哪些?
13、Redis 常見效能問題和解決方案?

最後

歡迎大家關注我的公眾號【程式設計師追風】,文章都會在裡面更新,整理的資料也會放在裡面。


相關文章