MyBatis 框架核心及面試知識要點

1、什么是 MyBatis?
MyBatis 是一款優秀的支持自定義 SQL 查詢、存儲過程和高級映射的持久層框架,消除了 幾乎所有的 JDBC 代碼和參數的手動設置以及結果集的檢索 。 MyBatis 可以使用 XML,或注解進 行配置和映射,MyBatis 通過將參數映射到配置的 SOL,形成最終執行的 SOL語句 ,最后將執行SOL的結果映射成Java對象返回。
2、Mybatis具有以下優點
(1) 小巧,學習成本低,會寫 SQL上手就很快了。
(2) 比 JDBC,基本上配置好了,大部分的工作量就專注在 SQL 的部分。
(3) 方便維護管理,SQL 不需要在Java代碼中找,SQL代碼可以分離出來,重用。
(4) 接近 JDBC, 靈活,支持動態 SQL。
(5) 支持對象與數據庫ORM 字段關系映射
3、Mybatis 的缺點如下
(1) SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。
(2) SQL語句依賴于數據庫,導致數據庫移植性差,不能隨意更換數據庫。
4、MyBatis框架適用場合:
如果你需要一個靈活的、可以動態生成映射關系的框架,如互聯網項目,MyBatis將是不錯的選擇。
5、MyBatis與Hibernate有哪些不同?
Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句。
Mybatis直接編寫原生態sql,可以嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求不高的軟件開發,因為這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件,則需要自定義多套sql映射文件,工作量大。
Hibernate對象/關系映射能力強,數據庫無關性好,對于關系模型要求高的軟件,如果用hibernate開發可以節省很多代碼,提高效率。
6、#{}和KaTeX parse error: Expected 'EOF', got '#' at position 11: {}的區別是什么? #?{}是預編譯處理,{}是字符串替換。
Mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;
Mybatis在處理 時,就是把 {}時,就是把 時,就是把{}替換成變量的值。
使用#{}可以有效的防止SQL注入,提高系統安全性。
7、Mybatis 中9個動態標簽是?
(1) if:結合 test 屬性使用,當參數滿足條件才會執行某個條件。
(2) choose(when、oterwise):相當于java 中的 if else,choose標簽是按順序判斷其內部when標簽中的test條件是否成立,如果有一個成立,則choose結束;如果所有的when條件都不滿足時,則執行otherwise中的SQL。類似于java的switch語句。
(3) trim (where、set):輔助條件標簽,結合 if 標簽使用,用于 SQL拼接問題。
(4) foreach:循環語句,批量操作時遍歷使用。
(5) bind:創建一個變量并將其綁定到上下文,防止SQL注入等。
九大標簽在項目中的具體使用可參考以下資料,我就不羅列了:
MyBatis的9種動態標簽詳解
8、xml 映射文件中,有哪些標簽?
(1) select:映射查詢操作。
(2) insert:映射插入操作。
(3) update:映射更新操作。
(4) delete:映射刪除操作。
(5) resultMap:定義結果集映射規則,將數據庫查詢結果與Java對象屬性進行映射。
(6) parameterMap:已廢棄,用于舊版的參數映射,現代MyBatis推薦直接在#{}中使用參數名。
(7)selectKey:在插入操作后立即執行一個SELECT語句以獲取自動生成的關鍵字(如序列ID或IDENTITY列),主要用于不支持自動返回主鍵值的數據庫系統。
(8) sql:定義可重用的SQL片段,可以被其他語句引用。
外加上述9個動態標簽,一同組成了 xml 文件的標簽。
9、當實體類中的屬性名和表中的字段名不一樣,怎么辦 ?
第1種:通過在查詢的 sql 語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致。

<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>         select order_id id, order_num orderNum ,order_price price   form orders   where order_id=#{id};      
</select>

第2種:通過來映射字段名和實體類屬性名的一一對應的關系。

<select id="getOrder" parameterType="int" resultMap="orderresultmap">  select * from orders where order_id=#{id}  
</select>  
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>  <!–用id屬性來映射主鍵字段–>  <id property=”id” column=”order_id”>  <!–用result屬性來映射非主鍵字段,property為實體類屬性名,column為數據表中的屬性–>  <result property = “orderNum” column =”order_num”/>  <result property=”price” column=”order_price” />  
</reslutMap>

10、like模糊查詢怎么寫?
(1) ‘%${value}%‘不推薦
(2) CONCAT(’%’,#{value},%) 推薦
(3) like '%‘1l #{value}ll’%
(4) 使用bind ,例如 like #{pattern)
11、Mybatis的分頁原理
Mybatis 使用 RowBounds 對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁,所以一般不會使用。可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。
分頁插件的原理就是使用 MyBatis 提供的插件接口,實現自定義插件,在插件的攔截方法內,攔截待執行的SQL,然后根據設置的 dialect(方言),和設置的分頁參數,重寫SQL ,生成帶有分頁語句的SQL,執行重寫后的SQL,從而實現分頁。
舉例:select * from student,攔截sql后重寫為:select t.* from (select * from student)t limit 0,10。
12、如何獲取自動生成的(主)鍵值?
(1) 使用注解:

@Options(useGeneratedKeys =true, keyProperty ="id”)
int insert( );

(2) 基于Xml:

<insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id"parameterType="person" >INSERT INTO person(name, pswd)VALUE (#{name}, #{pswd})
</insert>

13、一個 Xml 映射文件,都會寫一個 Dao 接口與之對應,這個 Dao 接口的工作原理是什么?
Dao 接口就是人們常說的 Mapper 接口,接口的全限名,就是映射文件中的 namespace 的值,接口的方法名就是映射文件中 MappedStatement 的 id 值,接口方法內的參數就是傳遞給 sql 的參數。
接口里的方法是不能重載的,因為是全限名+方法名的保存和尋找策略。
Dao接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理為Dao接口生成代理proxy對象,代理對象proxy會攔截接口方法,轉而執行接口方法所對應的MappedStatement所代表的sql,然后將sql執行結果返回。
MappedStatement:MappedStatement維護了一條 <select|update|delete|insert>節點的封裝,包括了傳入參數映射配置、執行的SQL語句、結果映射配置等信息。
14、在mapper中如何傳遞多個參數?
(1) 第一種

// DAO層的函數  
Public UserselectUser(String name,String area);  
// 對應的xml,#{0}代表接收的是dao層中的第一個參數,#{1}代表dao層中第二參數,更多參數一致往后加即可。  
<select id="selectUser"resultMap="BaseResultMap">    select *  fromuser_user_t where user_name = #{0} and user_area =#{1}     
</select>

(2) 第二種:使用 @param 注解:

public interface usermapper {  user selectUser(@param(“username”) string username,@param(“hashedpassword”) string hashedpassword);  }  
// 然后,就可以在xml像下面這樣使用(推薦封裝為一個map,作為單個參數傳遞給mapper):  
<select id=”selectUser” resulttype=”user”>  select id, username, hashedpassword  from some_table  where username = #{username} and hashedpassword = #{hashedpassword}   
</select>

(3) 第三種:多個參數封裝成map,然后在 xml 中通過 #{map的key}取值
15、什么是MyBatis的接口綁定,有哪些實現方式?
接口綁定,就是在 MyBatis 中任意定義接口,然后把接口里面的方法和SQL語句綁定,我們直接調用接口方法就可以,這樣比起原來了SqlSession提供的方法我們可以有更加靈活的選擇和設置。
接口綁定有兩種實現方式:
通過注解綁定,就是在接口的方法上面加上 @Select、@Update 等注解,里面包含Sql語句來綁定;
通過xml里面寫SQL來綁定, 在這種情況下,要指定xml映射文件里面的 namespace 必須為接口的全路徑名。當Sql語句比較簡單時候,用注解綁定, 當SQL語句比較復雜時候,用xml綁定,一般用xml綁定的比較多。
寫在最后,現在有一款 MyBatis-Plus框架, 完美兼容MyBatis,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。具體使用大家可以參考官方文檔:MyBatis-Plus 文檔

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

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

相關文章

FastSpeech2中文語音合成就步解析:TTS數據訓練實戰篇

參考github網址&#xff1a; GitHub - roedoejet/FastSpeech2: An implementation of Microsoft’s “FastSpeech 2: Fast and High-Quality End-to-End Text to Speech” 數據訓練所用python 命令&#xff1a; python3 train.py -p config/AISHELL3/preprocess.yaml -m confi…

ida動態調試-cnblog

ida動態調試 傳遞啟動ida服務 android_server在ida\dbgsrv目錄中 adb push android_server /data/local/tmp/chmod 755 /data/local/tmp/android_server /data/local/tmp/android_serveradb forward tcp:23946 tcp:23946ida報錯:大多是手機端口被占用 報錯提示&#xff1a; …

java面試-java基礎(下)

文章目錄 一、和equals區別&#xff1f;二、hashcode方法作用&#xff1f;兩個對象的hashCode方法相同&#xff0c;則equals方法也一定為true嗎&#xff1f;三、為什么重寫equals方法就一定要重寫hashCode方法&#xff1f;四、Java中的參數傳遞時傳值呢還是傳引用&#xff1f;五…

期末上分站——計組(3)

復習題21-42 21、指令周期是指__C_。 A. CPU從主存取出一條指令的時間 B. CPU執行一條指令的時間 C. CPU從主存取出一條指令的時間加上執行這條指令的時間。 D. 時鐘周期時間 22、微型機系統中外設通過適配器與主板的系統總線相連接&#xff0c;其功能是__D_。 A. 數據緩沖和…

數據庫可視化管理工具dbeaver試用及問題處理。

本文記錄了在內網離線安裝數據庫可視化管理工具dbeaver的過程和相關問題處理方法。 一、下載dbeaver https://dbeaver.io/download/ 筆者測試時Windows平臺最新版本為&#xff1a;dbeaver-ce-24.1.1-x86_64-setup.exe 二、安裝方法 一路“下一步”即可 三、問題處理 1、問…

【深度學習】vscode 命令行下的debug

其實我一直知道vscode可以再命令行下進行debug。 比如 python aaa.py --bb1 --cc2 以前的做法是 去aaa.py 寫死bb和cc 然后直接debug。 直到今天我遇到這個&#xff1a; hydra hydra.main(version_baseNone, config_name/home/justin/Desktop/code/python_project/WASB-SBDT-m…

Truffle學習筆記

Truffle學習筆記 安裝truffle, 注意: 雖然目前truffle最新版是 5.0.0, 但是經過我實踐之后, 返現和v4有很多不同(比如: web3.eth.accounts; 都獲取不到賬戶), 還是那句話: “nodejs模塊的版本問題會搞死人的 !” 目前4.1.15之前的版本都不能用了, 只能安裝v4.1.15 npm instal…

新手學Cocos報錯 [Assets] Failed to open

兩個都在偏好設置里面調&#xff08;文件下面的偏好設置&#xff09;&#xff1a; 1.設置中文&#xff1f; 2.報錯 [Assets] Failed to open&#xff1f; 這樣在點擊打開ts文件的時候就不會報錯&#xff0c;并且用vscode編輯器打開了&#xff0c; 同樣也可以改成你們自己喜歡…

LabVIEW在圖像處理中的應用

abVIEW作為一種圖形化編程環境&#xff0c;不僅在數據采集和儀器控制領域表現出色&#xff0c;還在圖像處理方面具有強大的功能。借助其Vision Development Module&#xff0c;LabVIEW提供了豐富的圖像處理工具&#xff0c;廣泛應用于工業檢測、醫學影像、自動化控制等多個領域…

Apache Seata應用側啟動過程剖析——RM TM如何與TC建立連接

本文來自 Apache Seata官方文檔&#xff0c;歡迎訪問官網&#xff0c;查看更多深度文章。 本文來自 Apache Seata官方文檔&#xff0c;歡迎訪問官網&#xff0c;查看更多深度文章。 Apache Seata應用側啟動過程剖析——RM & TM如何與TC建立連接 前言 看過官網 README 的第…

Android最近任務顯示的圖片

Android最近任務顯示的圖片 1、TaskSnapshot截圖1.1 snapshotTask1.2 drawAppThemeSnapshot 2、導航欄顯示問題3、Recentan按鍵進入最近任務 1、TaskSnapshot截圖 frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java frameworks/base/cor…

IPython 性能評估工具的較量:%%timeit 與 %timeit 的差異解析

IPython 性能評估工具的較量&#xff1a;%%timeit 與 %timeit 的差異解析 在 IPython 的世界中&#xff0c;性能評估是一項至關重要的任務。%%timeit 和 %timeit 是兩個用于測量代碼執行時間的魔術命令&#xff0c;但它們之間存在一些關鍵的差異。本文將深入探討這兩個命令的不…

2786. 訪問數組中的位置使分數最大

2786. 訪問數組中的位置使分數最大 題目鏈接&#xff1a;2786. 訪問數組中的位置使分數最大 代碼如下&#xff1a; //參考鏈接:https://leetcode.cn/problems/visit-array-positions-to-maximize-score/solutions/2810335/dp-by-kkkk-16-tn9f class Solution { public:long …

vue-router 4匯總

一、vue和vue-router版本&#xff1a; "vue": "^3.4.29", "vue-router": "^4.4.0" 二、路由傳參&#xff1a; 方式一&#xff1a; 路由配置&#xff1a;/src/router/index.ts import {createRouter,createWebHistory } from &quo…

探索 WebKit 的緩存迷宮:深入理解其高效緩存機制

探索 WebKit 的緩存迷宮&#xff1a;深入理解其高效緩存機制 在當今快速變化的網絡世界中&#xff0c;WebKit 作為領先的瀏覽器引擎之一&#xff0c;其緩存機制對于提升網頁加載速度、減少服務器負載以及改善用戶體驗起著至關重要的作用。本文將深入探討 WebKit 的緩存機制&am…

代碼隨想錄leetcode200題之額外題目

目錄 1 介紹2 訓練3 參考 1 介紹 本博客用來記錄代碼隨想錄leetcode200題之額外題目相關題目。 2 訓練 題目1&#xff1a;1365. 有多少小于當前數字的數字 解題思路&#xff1a;二分查找。 C代碼如下&#xff0c; class Solution { public:vector<int> smallerNumb…

卷積神經網絡(CNN)和循環神經網絡(RNN) 的區別與聯系

卷積神經網絡&#xff08;CNN&#xff09;和循環神經網絡&#xff08;RNN&#xff09;是兩種廣泛應用于深度學習的神經網絡架構&#xff0c;它們在設計理念和應用領域上有顯著區別&#xff0c;但也存在一些聯系。 ### 卷積神經網絡&#xff08;CNN&#xff09; #### 主要特點…

解決C++編譯時的產生的skipping incompatible xxx 錯誤

問題 我在編譯項目時&#xff0c;產生了一個 /usr/bin/ld: skipping incompatible ../../xxx/ when searching for -lxxx 的編譯錯誤&#xff0c;如下圖所示&#xff1a; 解決方法 由圖中的錯誤可知&#xff0c;在編譯時&#xff0c;是能夠在我們指定目錄下的 *.so 動態庫的…

python函數和c的區別有哪些

Python有很多內置函數&#xff08;build in function&#xff09;&#xff0c;不需要寫頭文件&#xff0c;Python還有很多強大的模塊&#xff0c;需要時導入便可。C語言在這一點上遠不及Python&#xff0c;大多時候都需要自己手動實現。 C語言中的函數&#xff0c;有著嚴格的順…

Java基礎(六)——繼承

個人簡介 &#x1f440;個人主頁&#xff1a; 前端雜貨鋪 ?開源項目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;?♂?學習方向&#xff1a; 主攻前端方向&#xff0c;正逐漸往全干發展 &#x1…