MyBatis面試題

MyBatis面試題:

1、MyBatis是什么?

  • Mybatis是一個半ORM(對象關系映射)框架,它內部封裝了JDBC,加載驅動、創建連接、創建statement等繁雜的過程,開發者開發時只需要關注如何編寫SQL語句,可以嚴格控制sql執行性能,靈活度高。

  • 作為一個半ORM框架,MyBatis 可以使用 XML 或注解來配置和映射原生信息,將 POJO映射成數據庫中的記錄,避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。

  • 通過xml 文件或注解的方式將要執行的各種 statement 配置起來,并通過java對象和 statement中sql的動態參數進行映射生成最終執行的sql語句,最后由mybatis框架執行sql并將結果映射為java對象并返回。(從執行sql到返回result的過程)。

  • 由于MyBatis專注于SQL本身,靈活度高,所以比較適合對性能的要求很高,或者需求變化較多的項目,如互聯網項目。

2、Mybaits的優缺點

優點:

  • 基于SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便于統一管理;提供XML標簽,支持編寫動態SQL語句,并可重用。

  • 與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼,不需要手動開關連接;

  • 很好的與各種數據庫兼容(因為MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持)。

  • 能夠與Spring很好的集成;

  • 提供映射標簽,支持對象與數據庫的ORM字段關系映射;提供對象關系映射標簽,支持對象關系組件維護。

缺點:

  • SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。

  • SQL語句依賴于數據庫,導致數據庫移植性差,不能隨意更換數據庫。

3、為什么說Mybatis是半自動ORM映射工具?它與全自動的區別在哪里?

Hibernate屬于全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,可以根據對象關系模型直接獲取,所以它是全自動的。

而Mybatis在查詢關聯對象或關聯集合對象時,需要手動編寫sql來完成,所以,稱之為半自動ORM映射工具。

4、Hibernate 和 MyBatis 的區別

相同點:

都是對jdbc的封裝,都是持久層的框架,都用于dao層的開發。

不同點:

(1)映射關系

MyBatis 是一個半自動映射的框架,配置Java對象與sql語句執行結果的對應關系,多表關聯關系配置簡單。

Hibernate 是一個全表映射的框架,配置Java對象與數據庫表的對應關系,多表關聯關系配置復雜。

(2) SQL優化和移植性

Hibernate 對SQL語句封裝,提供了日志、緩存、級聯(級聯比 MyBatis 強大)等特性,此外還提供HQL(Hibernate Query Language)操作數據庫,數據庫無關性支持好,但會多消耗性能。如果項目需要支持多種數據庫,代碼開發量少,但SQL語句優化困難。

MyBatis 需要手動編寫 SQL,支持動態 SQL、處理列表、動態生成表名、支持存儲過程。開發工作量相對大些。直接使用SQL語句操作數據庫,不支持數據庫無關性,但sql語句優化容易。

(3)開發難易程度和學習成本

Hibernate 是重量級框架,學習使用門檻高,適合于需求相對穩定,中小型的項目,比如:辦公自動化系統

MyBatis 是輕量級框架,學習使用門檻低,適合于需求變化頻繁,大型的項目,比如:互聯網電子商務系統

總結

MyBatis 是一個小巧、方便、高效、簡單、直接、半自動化的持久層框架,

Hibernate 是一個強大、方便、高效、復雜、間接、全自動化的持久層框架。

5、JDBC編程有哪些不足之處,MyBatis是如何解決這些問題的?

  • 數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。

    • 解決:在SqlMapConfig.xml中配置數據鏈接池,使用連接池管理數據庫鏈接。
  • Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。

    • 解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。
  • 向sql語句傳參數麻煩,因為sql語句的where條件不一定,可能多也可能少,占位符需要和參數一一對應。

    • 解決: Mybatis自動將java對象映射至sql語句。
  • 對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象解析比較方便。

    • 解決:Mybatis自動將sql執行結果映射至java對象。

6、MyBatis編程步驟是什么樣的?

  • 創建SqlSessionFactory

  • 通過SqlSessionFactory創建SqlSession

  • 通過sqlsession執行數據庫操作

  • 調用session.commit()提交事務

  • 調用session.close()關閉會話

7、MyBatis與Hibernate有哪些不同?

(1)Mybatis 和 hibernate 不同,它不完全是一個 ORM 框架,因為 MyBatis 需要 程序員自己編寫 Sql語句。

(2)Mybatis 直接編寫原生態 sql,可以嚴格控制 sql 執行性能,靈活度高,非常 適合對關系數據模型要求不高的軟件開發,因為這類軟件需求變化頻繁,一但需 求變化要求迅速輸出成果。但是靈活的前提是mybatis 無法做到數據庫無關性, 如果需要實現支持多種數據庫的軟件,則需要自定義多套 sql 映射文件,工作量大。

(3)Hibernate 對象/關系映射能力強,數據庫無關性好,對于關系模型要求高的 軟件,如果用hibernate 開發可以節省很多代碼,提高效率

8、Mybaits 的優點:

  • 基于 SQL 語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任 何影響,SQL 寫在XML 里,解除 sql 與程序代碼的耦合,便于統一管理;提供 XML 標簽,支持編寫動態 SQL 語句,并可重用。

  • 與 JDBC 相比,減少了 50%以上的代碼量,消除了 JDBC 大量冗余的代碼,不 需要手動開關連接;

  • 很好的與各種數據庫兼容(因為 MyBatis 使用 JDBC 來連接數據庫,所以只要 JDBC 支持的數據庫MyBatis 都支持)。

  • 能夠與 Spring 很好的集成;

  • 提供映射標簽,支持對象與數據庫的 ORM 字段關系映射;提供對象關系映射 標簽,支持對象關系組件維護

9、MyBatis 框架的缺點:

  • SQL 語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫 SQL 語句的功底有一定要求。

  • SQL 語句依賴于數據庫,導致數據庫移植性差,不能隨意更換數據庫。

10、#{}和${}的區別?

  • #{}是占位符,預編譯處理;${}是拼接符,字符串替換,沒有預編譯處理。

  • Mybatis在處理#{}時,#{}傳入參數是以字符串傳入,會將SQL中的#{}替換為?號,調用PreparedStatement的set方法來賦值。

  • Mybatis在處理時 , 是 原 值 傳 入 , 就 是 把 {}時,是原值傳入,就是把時,是原值傳入,就是把{}替換成變量的值,相當于JDBC中的Statement編譯

  • 變量替換后,#{} 對應的變量自動加上單引號 ‘’;變量替換后,${} 對應的變量不會加上單引號 ‘’

  • #{} 可以有效的防止SQL注入,提高系統安全性;${} 不能防止SQL 注入

  • #{} 的變量替換是在DBMS 中;${} 的變量替換是在 DBMS 外

11、通常一個Xml映射文件,都會寫一個Dao接口與之對應,那么這個Dao接口的工作原理是什么?Dao接口里的方法、參數不同時,方法能重載嗎?

Dao接口即Mapper接口。接口的全限名就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法內的參數,就是傳遞給sql的參數。Mapper接口是沒有實現類的,當調用接口方法時,接口全限名+方法名的拼接字符串作為key值,可唯一定位一個

MapperStatement。

Dao接口里的方法,是不能重載的,因為是全限名+方法名的保存和尋找策略。

Dao接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理為Dao接口生成代理proxy對象,代理對象proxy會攔截接口方法,轉而執行MappedStatement所代表的sql,然后將sql執行結果返回。

12、在Mapper中如何傳遞多個參數?

  • 若Dao層函數有多個參數,那么其對應的xml中,#{0}代表接收的是Dao層中的第一個參數,#{1}代表Dao中的第二個參數,以此類推。

  • 使用@Param注解:在Dao層的參數中前加@Param注解,注解內的參數名為傳遞到Mapper中的參數名。

  • 多個參數封裝成Map,以HashMap的形式傳遞到Mapper中。

13、Mybatis動態sql有什么用?執行原理是什么?有哪些動態sql?

Mybatis動態sql可以在xml映射文件內,以標簽的形式編寫動態sql,執行原理是根據表達式的值完成邏輯判斷,并動態拼接sql的功能。

Mybatis提供了9種動態sql標簽:trim、where、set、foreach、if、choose、when、otherwise、bind

14、xml映射文件中,不同的xml映射文件id是否可以重復?

不同的xml映射文件,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;

原因是namespace+id是作為Map<String,MapperStatement>的key使用的,如果沒有namespace,就剩下id,那么id重復會導致數據互相覆蓋。有了namespace,自然id就可以重復,namespace不同,namespace+id自然也不同。

15、Mybatis實現一對一有幾種方式?具體是怎么操作的?

有聯合查詢和嵌套查詢兩種方式。

聯合查詢是幾個表聯合查詢,通過在resultMap里面配置association節點配置一對一的類就可以完成;

嵌套查詢是先查一個表,根據這個表里面的結果的外鍵id,再去另外一個表里面查詢數據,也是通過association配置,但另外一個表的查詢是通過select配置的。

16、Mybatis實現一對多有幾種方式?具體是怎么操作的?

有聯合查詢和嵌套查詢兩種方式。

聯合查詢是幾個表聯合查詢,只查詢一次,通過在resultMap里面的collection節點配置一對多的類就可以完成;

嵌套查詢是先查一個表,根據這個表里面的結果的外鍵id,再去另外一個表里面查詢數據,也是通過collection,但另外一個表的查詢是通過select配置的。

17、Mybatis的一級、二級緩存

1、 一級緩存:基于PerpetualCache的HashMap本地緩存,其存儲作用域為Session,當Session flush或close之后,該Session中的所有Cache就將清空,默認打開一級緩存。

2、 二級緩存與一級緩存機制相同,默認也是采用PerpetualCache,HashMap存儲,不同在于其存儲作用域為Mapper(namespace),并且可自定義存儲源,如Ehcache。默認打不開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實現Serializable序列化接口(可用來保存對象的態),可在它的映射文件中配置。

對于緩存數據更新機制,當某一個作用域(一級緩存Session/二級緩存Namespace)進行了增/刪/改操作后,默認該作用域下所有select中的緩存將被clear。

18、使用MyBatis的Mapper接口調用時有哪些要求?

  • Mapper接口方法名和mapper.xml中定義的每個sql的id相同;

  • Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql的parameterType類型相同;

  • Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同;

  • Mapper.xml文件中的namespace即是mapper接口的類路徑。

19、Mybatis動態sql是做什么的?都有哪些動態sql?

Mybatis動態sql可以讓我們在Xml映射文件內,以標簽的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能,Mybatis提供了9種動態sql標簽

trim|where|set|foreach|if|choose|when|otherwise|bind。背過

其執行原理為,使用OGNL從sql參數對象中計算表達式的值,根據表達式的值動態拼接sql,以此來完成動態sql的功能。

20、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重復?

不同的Xml映射文件,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;畢竟namespace不是必須的,只是最佳實踐而已。

原因就是namespace+id是作為Map<String, MappedStatement>的key使用的,如果沒有

namespace,就剩下id,那么,id重復會導致數據互相覆蓋。有了namespace,自然id就可以重復,namespace不同,namespace+id自然也就不同。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37947.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

榮耀X40 GT真機調試APP,HBuilder X刷新不到設備

今天使用榮耀X40GT進行真機調試App的時候&#xff0c;hbuilder怎么都刷不出來設備&#xff0c;經歷一番風雨最終連接成功&#xff0c;特此記錄一下。 我的設備Android版本12&#xff0c;MagicOS版本7.0&#xff0c;進行了如下配置&#xff1a; 1、打開“設置”-》“系統和更新”…

keil5突然編譯輸出框build output 不見了

今天keil5突然編譯輸出框build output 不見了&#xff0c;但可以編譯和下載。 首先嘗試&#xff0c;在view里面打開和關閉build output window&#xff0c;沒有反應&#xff1b; 其次&#xff0c;點擊window-reset view to defaults&#xff0c;果然build output又恢復了&#…

數據結構---圖

這里寫目錄標題 圖的基本概念和術語基本概念和術語1基本概念和術語2 圖的類型定義抽象數據類型定義二級目錄二級目錄 一級目錄二級目錄二級目錄二級目錄二級目錄二級目錄二級目錄 圖的基本概念和術語 基本概念和術語1 V代表頂點的有窮非空集合 E代表邊的有窮集合 n為頂點 有向…

數據結構與算法-棧(LIFO)(經典面試題)

一&#xff1a;面試經典 1. 如何設計一個括號匹配的功能&#xff1f;比如給你一串括號讓你判斷是否符合我們的括號原則&#xff0c; 棧 力扣 2. 如何設計一個瀏覽器的前進和后退功能&#xff1f; 思想&#xff1a;兩個棧&#xff0c;一個棧存放前進棧&…

Python爬蟲之解決瀏覽器等待與代理隧道問題

作為專業爬蟲程序員&#xff0c;我們往往需要應對一些限制性挑戰&#xff0c;比如瀏覽器等待和使用代理隧道。在Python爬蟲開發中&#xff0c;這些問題可能會導致我們的爬蟲受阻。本文將為你分享解決這些問題的方案&#xff0c;幫助你順利應對瀏覽器等待和代理隧道的挑戰&#…

【vue3】固定上導航欄和左側導航欄,只顯示其他內容在主內容區域

實現思路&#xff1a; 在一個單獨的vue組件文件中只寫出上導航欄和左側導航欄的內容將你想要展示的頁面主內容寫到單獨的組件中在index.js寫路由&#xff0c;將【想要展示的頁面主內容的路由】作為【子路由】寫在【只寫出上導航欄和左側導航欄的路由】的下面&#xff1b; 在el…

Oracle 開發篇+Java通過共享模式訪問Oracle數據庫

標簽&#xff1a;共享服務器進程、shared server process釋義&#xff1a;shared server process是Oracle的一種數據庫連接技術&#xff0c;類似的還有專用模式和DRCP ★ 數據庫配置 alter system set shared_server_sessions1 scopespfile; alter system set max_shared_serv…

AIGC|AGI究竟是什么?為什么大家都在爭先入場?

一、AI大語言模型進入爆發階段 2022年12月ChatGPT突然爆火&#xff0c;原因是其表現出來的智能化已經遠遠突破了我們的常規認知。雖然其呈現在使用者面前僅僅只是一個簡單的對話問答形式&#xff0c;但是它的內容化水平非常強大&#xff0c;甚至在某些方面已經超過人類了&#…

運動控制系統::幾篇大佬的文章

運動規劃 - 知乎 (zhihu.com) 運動規劃、運動控制 & 運動感知 - 知乎 (zhihu.com)

電腦屏幕閃爍?別慌!解決方法在這!

“我新買了一臺電腦&#xff0c;還沒用幾天呢&#xff0c;就出現了電腦屏幕閃爍的情況&#xff0c;這讓我感到很煩躁。有什么方法可以解決電腦屏幕閃爍的問題呢&#xff1f;” 使用電腦的過程中&#xff0c;我們不難發現電腦屏幕有時候會出現閃爍的情況&#xff0c;這會導致使用…

在線預覽Word、Excel、PowerPoint等文件

在我們工作時&#xff0c;經常會有在線查看各種不同類型的文件的需要&#xff0c;如Word文檔、Excel表格、PowerPoint幻燈片和PDF等。可以直接在這里預覽&#xff1a;https://www.compdf.com/webviewer/demo Word 文件實現前端預覽 方案一&#xff1a; 使用 XDOC 可以實現預…

vscode|pycharm + docker + python

1&#xff0c;docker run的時候要加上port docker run -it --gpusall -p 2222:22 -v /掛載目錄/:/docker 目錄1/ -v /掛載目錄/:/docker 目錄2/ --namexxx image:v2 /bin/bash 2&#xff0c;docker 內部要安裝ssh 2.1方法命令&#xff1a; apt-get update apt-get install…

使用藍牙外設卻不小心把臺式機電腦藍牙關了

起因 今天犯了一個賊SB的錯誤&#xff0c;起因是藍牙鍵盤突然就不能輸入了&#xff08;雖然是連接狀態&#xff0c;但是按什么鍵都沒有反應&#xff09; 原來我的解決方法就是重啟一下電腦&#xff0c;但是那會電腦開了賊多的軟件。我就想重啟也太麻煩了&#xff0c;既然重啟…

Linux版本 centOS 7,java連接mysql

在Linux下 使用java 訪問數據庫 &#xff0c; java 1.7版本&#xff0c; mysql 8.0.33版本&#xff0c; 連接驅動 mysql-connector-java-5.1.49.jar 代碼如下&#xff1a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import ja…

C#學習,反射

目錄 C#學習 .NET的體系結構 二次編譯 反射 什么是反射&#xff1f; 什么是Type&#xff1f; 什么是程序集&#xff1f; 反射API&#xff1a; 一&#xff0c;程序集 1&#xff0c; Load 2&#xff0c;LoadFrom 3&#xff0c;LoadFile 二&#xff0c;類型實例 1&a…

SSM中接口+mapper文件(增刪改查)

IActivateInfoDao接口 public interface IActivateInfoDao{//根據用戶id和驗證類型&#xff0c;判斷認證是否已存在ActivateInfo selectByUserIdAndType(Param("userId") String userId, Param("type") String type);//插入int insert(ActivateInfo activ…

一文讀懂c++語言

一文讀懂C語言 C的發展C的設計目標C的特性C的挑戰 C的發展 C是一種通用的、高級的編程語言&#xff0c;它是C語言的擴展。C由Bjarne Stroustrup于1983年首次引入&#xff0c;并在之后的幾十年中不斷發展壯大。C被廣泛應用于各種領域&#xff0c;包括系統開發、游戲開發、嵌入式…

pytest數據驅動(最簡單)

目錄 第一種&#xff1a;通過yaml文件獲取數據&#xff08;一維列表&#xff09; 第二種&#xff1a;通過yaml文件獲取數據&#xff08;二維列表&#xff09; 第三種&#xff1a;通過yaml文件獲取數據&#xff08;pytest.fixture&#xff09; 資料獲取方法 第一種&#xff…

國際騰訊云賬號云核算概述!!

云核算概述 維基百科界說&#xff1a;云核算是一種依據互聯網的新型核算方法&#xff0c;經過互聯網上異構、自治的服務為個人和企業供給按需即取的核算。 云核算描繪的一起特征&#xff1a;云是一種按需運用的服務&#xff0c;運用者只重視服務本身。 云核算作為IT服務形式&am…

四、Linux中cd、pwd以及相對/絕對路徑和特殊路徑符

1、cd命令&#xff1a; cd命令可以切換當前工作目錄&#xff0c;基礎語法是&#xff1a; cd [linux路徑] &#xff08;1&#xff09;、打開Linux的命令提示行&#xff0c;當前工作目錄是home&#xff0c;輸入“cd /”&#xff0c;可以切換到根目錄下&#xff0c;在根目錄下輸…