一、談?wù)勀銓?MyBatis 的理解?
網(wǎng)站的建設(shè)創(chuàng)新互聯(lián)建站專注網(wǎng)站定制,經(jīng)驗豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計體驗!已為成都汽車玻璃修復(fù)等企業(yè)提供專業(yè)服務(wù)。
1. Mybatis是一個半ORM(對象關(guān)系映射)框架,它內(nèi)部封裝了 JDBC,開發(fā)時只需要關(guān)注 SQL 語句本身,不需要花費精力去處理加載驅(qū)動、創(chuàng)建連接、創(chuàng)建 Statement 等繁雜的過程。程序員直接編寫原生態(tài) SQL,可以嚴格控制 SQL 執(zhí)行性能,靈活度高。
2. MyBatis 可以使用 XML 或注解來配置和映射原生信息,將 POJO 映射成數(shù)據(jù)庫中的記錄,避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集。3. 通過 XML 文件或注解的方式將要執(zhí)行的各種 Statement 配置起來,并通過 Java 對象和 Statement 中 SQL 的動態(tài)參數(shù)進行映射生成最終執(zhí)行的 SQL 語句,最后由 MyBatis 框架執(zhí)行 SQL并將結(jié)果映射為 Java 對象并返回。(從執(zhí)行 SQL到返回 Result 的過程)。
二、MyBaits 的優(yōu)缺點有哪些?
§ 優(yōu)點:
1. 基于 SQL 語句編程,相當靈活,不會對應(yīng)用程序或者數(shù)據(jù)庫的現(xiàn)有設(shè)計造成任何影響,SQL 寫在 XML 里,解除 SQL 與程序代碼的耦合,便于統(tǒng)一管理;提供XML標簽,支持編寫動態(tài) SQL 語句,并可重用;
2. 與 JDBC 相比,減少了代碼量,消除了 JDBC 大量冗余的代碼,不需要手動開關(guān)連接;
3. 很好的與各種數(shù)據(jù)庫兼容(因為 MyBatis 使用 JDBC 來連接數(shù)據(jù)庫,所以只要 JDBC 支持的數(shù)據(jù)庫 MyBatis 都支持);
4. 提供映射標簽,支持對象與數(shù)據(jù)庫的 ORM 字段關(guān)系映射;提供對象關(guān)系映射標簽,支持對象關(guān)系組件維護。
§ 缺點:
1. SQL 語句的編寫工作量較大,尤其當字段多、關(guān)聯(lián)表多時,對開發(fā)人員編寫 SQL 語句的功底有一定要求;
2. SQL 語句依賴于數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫移植性差,不能隨意更換數(shù)據(jù)庫。
三、MyBatis 與 Hibernate 有哪些不同?
1. MyBatis 和 Hibernate不同,它不完全是一個 ORM 框架,因為 MyBatis 需要程序員自己編寫 SQL 語句;Hibernate 對象/關(guān)系映射能力強,數(shù)據(jù)庫無關(guān)性好,對于關(guān)系模型要求高的軟件,如果用 Hibernate 開發(fā)可以節(jié)省很多代碼,提高效率;
2. MyBatis 直接編寫原生態(tài) SQL,可以嚴格控制 SQL 執(zhí)行性能,靈活度高,非常適合對關(guān)系數(shù)據(jù)模型要求不高的軟件開發(fā),因為這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。但是靈活的前提是 MyBatis 無法做到數(shù)據(jù)庫無關(guān)性,如果需要實現(xiàn)支持多種數(shù)據(jù)庫的軟件,則需要自定義多套 SQL 映射文件,工作量大。
四、MyBatis 中 #{} 和 ${}的區(qū)別是什么?
§ #{} 是預(yù)編譯處理,${} 是字符串替換
1. Mybatis 在處理 #{} 時,會將 SQL 中的 #{} 替換為 ? 號,調(diào)用 PreparedStatement 的 set 方法來賦值;使用 #{} 可以有效的防止 SQL 注入,提高系統(tǒng)安全性;2. MyBatis 在處理 ${} 時,就是把 ${} 替換成變量的值。
五、MyBatis 是如何進行分頁的?分頁插件的原理是什么?
MyBatis 使用 RowBounds 對象進行分頁,它是針對 ResultSet 結(jié)果集執(zhí)行的內(nèi)存分頁,而非物理分頁??梢栽?SQL 內(nèi)直接書寫帶有物理分頁的參數(shù)來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。
分頁插件的基本原理是使用 MyBatis 提供的插件接口,實現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的 SQL,然后重寫 SQL,根據(jù) dialect 方言,添加對應(yīng)的物理分頁語句和物理分頁參數(shù)。
六、MyBatis 有幾種分頁方式?
1. 數(shù)組分頁
2. SQL 分頁
3. 攔截器分頁
4. RowBounds 分頁
七、MyBatis 邏輯分頁和物理分頁的區(qū)別是什么?
1. 物理分頁速度上并不一定快于邏輯分頁,邏輯分頁速度上也并不一定快于物理分頁。
2. 物理分頁總是優(yōu)于邏輯分頁:沒有必要將屬于數(shù)據(jù)庫端的壓力加到應(yīng)用端來,就算速度上存在優(yōu)勢,然而其它性能上的優(yōu)點足以彌補這個缺點。
八、MyBatis 是否支持延遲加載?如果支持,它的實現(xiàn)原理是什么?
Mybatis 僅支持 association 關(guān)聯(lián)對象和 collection 關(guān)聯(lián)集合對象的延遲加載,association 指的就是一對一,collection 指的就是一對多查詢。在MyBatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。
它的原理是,使用 CGLIB 創(chuàng)建目標對象的代理對象,當調(diào)用目標方法時,進入攔截器方法,比如調(diào)用 a.getB().getName(),攔截器 invoke() 方法發(fā)現(xiàn) a.getB() 是 null 值,那么就會單獨發(fā)送事先保存好的查詢關(guān)聯(lián) B 對象的 SQL,把 B 查詢上來,然后調(diào)用 a.setB(b),于是 a 的對象 b 屬性就有值了,接著完成 a.getB().getName() 方法的調(diào)用。這就是延遲加載的基本原理。
九、說一下 MyBatis 的一級緩存和二級緩存?
一級緩存:基于 PerpetualCache 的 HashMap 本地緩存,其存儲作用域為 Session,當 Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空,默認打開一級緩存;
二級緩存:與一級緩存其機制相同,默認也是采用 PerpetualCache,HashMap 存儲,不同在于其存儲作用域為 Mapper(Namespace),并且可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實現(xiàn) Serializable 序列化接口(可用來保存對象的狀態(tài)),可在它的映射文件中配置 <cache/> ;
對于緩存數(shù)據(jù)更新機制,當某一個作用域(一級緩存 Session / 二級緩存 Namespaces)的進行了 C/U/D 操作后,默認該作用域下所有 select 中的緩存將被 clear。
十、Mybatis 有哪些執(zhí)行器(Executor)?
Mybatis 有 3 種基本的執(zhí)行器(Executor):
1. SimpleExecutor:每執(zhí)行一次 update 或 select,就開啟一個 Statement 對象,用完立刻關(guān)閉 Statement 對象;
2. ReuseExecutor:執(zhí)行 update 或 select,以 SQL 作為 key 查找 Statement 對象,存在就使用,不存在就創(chuàng)建,用完后,不關(guān)閉 Statement 對象,而是放置于 Map 內(nèi),供下一次使用。簡言之,就是重復(fù)使用 Statement 對象;
3. BatchExecutor:執(zhí)行 update(沒有 select,JDBC 批處理不支持select),將所有 SQL 都添加到批處理中(addBatch()),等待統(tǒng)一執(zhí)行(executeBatch()),它緩存了多個 Statement 對象,每個 Statement對 象都是 addBatch() 完畢后,等待逐一執(zhí)行 executeBatch() 批處理。與 JDBC 批處理相同。
十一、MyBatis 動態(tài) SQL 是做什么的?都有哪些動態(tài) SQL?能簡述一下動態(tài) SQL的執(zhí)行原理不?
1. MyBatis 動態(tài) SQL 可以讓我們在 XML 映射文件內(nèi),以標簽的形式編寫動態(tài) SQL,完成邏輯判斷和動態(tài)拼接 SQL 的功能;
2. MyBatis 提供了 9 種動態(tài) SQL 標簽:trim、where、set、foreach、if、choose、when、otherwise、bind;
3. 執(zhí)行原理:使用 OGNL 從 SQL 參數(shù)對象中計算表達式的值,根據(jù)表達式的值動態(tài)拼接 SQL,以此來完成動態(tài) SQL 的功能。
消息隊列面試題
1、消息隊列的基本作用?
2、消息隊列的優(yōu)缺點有哪些?
3、如何保證消息隊列的高可用?
4、如何保證消息不被重復(fù)消費?或者說,如何保證消息消費的冪等性?
5、如何保證消息的可靠性傳輸?或者說,如何處理消息丟失的問題?
6、如何保證消息的順序性?
7、大量消息在 MQ 里長時間積壓,該如何解決?
8、MQ 中的消息過期失效了怎么辦?
9、RabbitMQ 有哪些重要的角色?
10、RabbitMQ 有哪些重要的組件?
11、RabbitMQ 有幾種廣播類型?
12、Kafka 可以脫離 zookeeper 單獨使用嗎?為什么?
13、Kafka 有幾種數(shù)據(jù)保留的策略?
14、Kafka 的分區(qū)策略有哪些?
歡迎大家關(guān)注我的公種浩【程序員追風】,文章都會在里面更新,整理的資料也會放在里面。
redis面試題
1、談下你對 Redis 的了解?
2、Redis 一般都有哪些使用場景?
3、Redis 有哪些常見的功能?
4、Redis 支持的數(shù)據(jù)類型有哪些?
5、Redis 為什么是單線程的?
6、Redis 為什么這么快?
7、什么是緩存穿透?怎么解決?
8、什么是緩存雪崩?該如何解決?
9、 怎么保證緩存和數(shù)據(jù)庫數(shù)據(jù)的一致性?
10、Redis 持久化有幾種方式?
11、Redis 怎么實現(xiàn)分布式鎖?
12、Redis 淘汰策略有哪些?
13、Redis 常見性能問題和解決方案?
最后
歡迎大家一起交流,喜歡文章記得點個贊喲,感謝支持!
分享名稱:阿里最新38道Java面試題解析(MyBatis+消息隊列+Redis)
標題鏈接:http://aaarwkj.com/article16/iggjdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、靜態(tài)網(wǎng)站、云服務(wù)器、網(wǎng)站導(dǎo)航、品牌網(wǎng)站制作、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)