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

1、談談你對 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 的過程)。面試

2、MyBaits 的優缺點有哪些?

§ 優勢:

1. 基於 SQL 語句編程,至關靈活,不會對應用程序或者數據庫的現有設計形成任何影響,SQL 寫在 XML 裏,解除 SQL 與程序代碼的耦合,便於統一管理;提供XML標籤,支持編寫動態 SQL 語句,並可重用;
2. 與 JDBC 相比,減小了代碼量,消除了 JDBC 大量冗餘的代碼,不須要手動開關鏈接;
3. 很好的與各類數據庫兼容(由於 MyBatis 使用 JDBC 來鏈接數據庫,因此只要 JDBC 支持的數據庫 MyBatis 都支持);
4. 提供映射標籤,支持對象與數據庫的 ORM 字段關係映射;提供對象關係映射標籤,支持對象關係組件維護。

§ 缺點:

1. SQL 語句的編寫工做量較大,尤爲當字段多、關聯表多時,對開發人員編寫 SQL 語句的功底有必定要求;
2. SQL 語句依賴於數據庫,致使數據庫移植性差,不能隨意更換數據庫。

3、MyBatis 與 Hibernate 有哪些不一樣?

1. MyBatis 和 Hibernate不一樣,它不徹底是一個 ORM 框架,由於 MyBatis 須要程序員本身編寫 SQL 語句;Hibernate 對象/關係映射能力強,數據庫無關性好,對於關係模型要求高的軟件,若是用 Hibernate 開發能夠節省不少代碼,提升效率;

2. MyBatis 直接編寫原生態 SQL,能夠嚴格控制 SQL 執行性能,靈活度高,很是適合對關係數據模型要求不高的軟件開發,由於這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。可是靈活的前提是 MyBatis 沒法作到數據庫無關性,若是須要實現支持多種數據庫的軟件,則須要自定義多套 SQL 映射文件,工做量大。數據庫

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

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

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

5、MyBatis 是如何進行分頁的?分頁插件的原理是什麼?

MyBatis 使用 RowBounds 對象進行分頁,它是針對 ResultSet 結果集執行的內存分頁,而非物理分頁。能夠在 SQL 內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可使用分頁插件來完成物理分頁。
分頁插件的基本原理是使用 MyBatis 提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的 SQL,而後重寫 SQL,根據 dialect 方言,添加對應的物理分頁語句和物理分頁參數。

6、MyBatis 有幾種分頁方式?

1. 數組分頁
2. SQL 分頁
3. 攔截器分頁
4. RowBounds 分頁

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

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

8、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() 方法的調用。這就是延遲加載的基本原理。

9、說一下 MyBatis 的一級緩存和二級緩存?

一級緩存:基於 PerpetualCache 的 HashMap 本地緩存,其存儲做用域爲 Session,當 Session flush 或 close 以後,該 Session 中的全部 Cache 就將清空,默認打開一級緩存;
二級緩存:與一級緩存其機制相同,默認也是採用 PerpetualCache,HashMap 存儲,不一樣在於其存儲做用域爲 Mapper(Namespace),而且可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啓二級緩存,使用二級緩存屬性類須要實現 Serializable 序列化接口(可用來保存對象的狀態),可在它的映射文件中配置 <cache/> ;
對於緩存數據更新機制,當某一個做用域(一級緩存 Session / 二級緩存 Namespaces)的進行了 C/U/D 操做後,默認該做用域下全部 select 中的緩存將被 clear。

10、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 批處理相同。

11、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 的功能。

消息隊列面試題

一、消息隊列的基本做用?
二、消息隊列的優缺點有哪些?
三、如何保證消息隊列的高可用?
四、如何保證消息不被重複消費?或者說,如何保證消息消費的冪等性?
五、如何保證消息的可靠性傳輸?或者說,如何處理消息丟失的問題?
六、如何保證消息的順序性?
七、大量消息在 MQ 里長時間積壓,該如何解決?
八、MQ 中的消息過時失效了怎麼辦?
九、RabbitMQ 有哪些重要的角色?
十、RabbitMQ 有哪些重要的組件?
十一、RabbitMQ 有幾種廣播類型?
十二、Kafka 能夠脫離 zookeeper 單獨使用嗎?爲何?
1三、Kafka 有幾種數據保留的策略?
1四、Kafka 的分區策略有哪些?

Redis面試題

一、談下你對 Redis 的瞭解?
二、Redis 通常都有哪些使用場景?
三、Redis 有哪些常見的功能?
四、Redis 支持的數據類型有哪些?
五、Redis 爲何是單線程的?
六、Redis 爲何這麼快?
七、什麼是緩存穿透?怎麼解決?
八、什麼是緩存雪崩?該如何解決?
九、 怎麼保證緩存和數據庫數據的一致性?
十、Redis 持久化有幾種方式?
十一、Redis 怎麼實現分佈式鎖?
十二、Redis 淘汰策略有哪些?
1三、Redis 常見性能問題和解決方案?

最後

歡迎你們關注個人公衆號【程序員追風】,文章都會在裏面更新,整理的資料也會放在裏面。安全

相關文章
相關標籤/搜索