JavaEE-Mybatis初階

什么是MyBatis

MyBatis是?款優秀的 持久層 框架,?于簡化JDBC的開發。

MyBatis本是 Apache的?個開源項?iBatis,2010年這個項?由apache遷移到了google code,并

且改名為MyBatis 。2013年11?遷移到Github

創建項目時添加依賴

上面有提到?個詞:持久層

持久層:指的就是持久化操作的層, 通常指數據訪問層(dao), 是?來操作數據庫的.

簡單來說 MyBatis 是更簡單完成程序和數據庫交互的框架,也就是更簡單的操作和讀取數據庫工具

MyBatis??

Mybatis操作數據庫的步驟:

準備?作

創建?程

創建springboot?程,并導? mybatis的起步依賴、mysql的驅動包

Mybatis 是?個持久層框架, 具體的數據存儲和數據操作還是在MySQL中操作的, 所以需要添加

MySQL驅動

項??程創建完成后,?動在pom.xml?件中,導?Mybatis依賴和MySQL驅動依賴

版本會隨著SpringBoot 版本發?變化

SpringBoot 3.X對?MyBatis版本為3.X

對應關系參考: https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

?

數據準備

創建??表, 并創建對應的實體類User
創建對應的實體類 UserInfo
實體類的屬性名與表中的字段名??對應,一模一樣

配置數據庫連接字符串

注意事項:

如果使? MySQL 是 5.x 之前的使?的是"com.mysql.jdbc.Driver",如果是?于 5.x 使?的 是“com.mysql.cj.jdbc.Driver”.

寫持久層代碼

單元測試

@SpringBootTest就是一個將運行環境交給這個測試類的注解,沒有這個注解,就沒法注入依賴這些操作,因為被管理的依賴都是在運行環境里的。

MyBatis的基礎操作

上?使用了Mybatis的查詢操作, 接下來學習MyBatis的增, 刪, 改操作

在學習這些操作之前, 我們先來學習MyBatis?志打印

打印?志

在Mybatis當中我們可以借助?志, 查看到sql語句的執?、執?傳遞的參數以及執?結果
在配置?件中進?配置即可

重新運?程序, 可以看到SQL執?內容, 以及傳遞參數和執?結果

參數傳遞

需求: 查找id=4的??,對應的SQL就是: select * from user_info where id=4

但是這樣的話, 只能查找id=4 的數據, 所以SQL語句中的id值不能寫成固定數值,需要變為動態的數值

解決?案:在queryById?法中添加?個參數(id),將?法中的參數,傳給SQL語句

使? #{} 的?式獲取?法中的參數

如果mapper接??法形參只有?個普通類型的參數,#{…} ??的屬性名可以隨便寫,如:#{id}、# {value}。需要和參數名保持一樣,不然沒法成功傳參,或者使用注解標識參數名。順序不重要,參數名對的上就行。但是如果只傳遞一個參數,參數名就不需要對上,因為只有一個參數也沒得選,但是最好還是參數名和#{}里的名稱對上。

不建議使用方法:

使用paramN在#{}里,這個代值第n個參數。

如果只查詢0-1個表當中的數據來賦值給實體類,那么返回值為實體類就行了,沒查詢到會返回null。如果返回多個數據卻用實體類接收會報異常。

如果是查詢0-n個數據,就需要將返回值設置為List<T>T是實體類,沒查詢到會返回null。

如果返回值為基礎類型,不是包裝類沒有查詢到數據,返回值可能會有邏輯錯誤,所以只查詢一個基礎類型的話推薦使用包裝類,包裝了的話沒有查詢到返回null。

list來接受數據庫給的返回值是因為,這樣就不需要關心數據庫具體返回的類型是什么arraylist 還是linklist,只需要知道是一個list類型,來通過多態就可以調用list通用的方法了。

增(Insert)

也可以將傳遞的參數直接改成傳遞對象,對象里的屬性名和類型也是要一一對應的。

返回主鍵

Insert 語句默認返回的是受影響的?數,這些mysql語句的返回值和在數據庫直接調用的返回值是一樣的。

但有些情況下, 數據插?之后, 還需要有后續的關聯操作, 需要獲取到新插?數據的id

?如訂單系統

當我們下完訂單之后, 需要通知物流系統, 庫存系統, 結算系統等, 這時候就需要拿到訂單ID

如果想要拿到?增id, 需要在Mapper接?的?法上添加?個Options的注解

這個自增id會被賦值到傳遞的對象里面,通過getid來獲得。

刪(Delete)

改(Update)

查(Select)

可以看到,mysql的屬性寫法是下劃線寫法,而java類當中的寫法是小駝峰寫法。

起別名

結果映射

開啟駝峰命名

mybatis:
????????configuration:
????????????????map-underscore-to-camel-case: true # 配置駝峰?動轉換

MyBatis XML配置文件

Mybatis的開發有兩種?式:

注解

XML

上?學習了注解的?式, 接下來我們學習XML的?式

使?Mybatis的注解?式,主要是來完成?些簡單的增刪改查功能. 如果需要實現復雜的SQL功能,建議使?XML來配置映射語句,也就是將SQL語句寫在XML配置?件中.

MyBatis XML的?式需要以下兩步:

配置數據庫連接字符串和MyBatis

寫持久層代碼

配置連接字符串和MyBatis和寫持久層代碼的?法定義 Interface和使用注解來完成數據庫交互的步驟是一樣的,除了還要設置MyBatis的XML的文件設置,配置xml文件的掃描路徑。

配置連接字符串和MyBatis

# 配置 mybatis xml 的?件路徑,在 resources/mapper 創建所有表的 xml ?件
10 mybatis.mapper-locations = classpath:mapper/**Mapper.xml
mybatis:
10 mapper-locations: classpath:mapper/**Mapper.xml

?

寫持久層代碼

?

添加 mapper 接口

注解和xml定義的接口不需要另外實現,用注解和xml就自動實現了。

添加 UserInfoXMLMapper.xml

數據持久成的實現,MyBatis 的固定 xml 格式

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.mapper.UserInfoMapper">//這個定義的是要實//現的類的路徑

</mapper>

<?xml version="1.0" encoding="UTF-8"?>

- 作用:這是 XML 文件的聲明部分,用于定義 XML 的版本和字符編碼。
?
- 解釋:
?
- ?version="1.0"?:指定 XML 文檔遵循的 XML 1.0 規范,是目前最基礎、通用的 XML 版本。
?
- ?encoding="UTF-8"?:設置 XML 文件的字符編碼為 UTF-8,確保文件能正確解析中文字符等特殊字符,避免亂碼問題。?

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

- 作用:定義 XML 的文檔類型(DTD,Document Type Definition),用于約束 Mapper XML 的結構和語法。
?
- 解釋:
?
- ?<!DOCTYPE mapper ... >?:聲明這是一個 MyBatis 的 ?mapper??類型文檔。
?
- ?PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"?:表示這是 MyBatis 官方定義的公共 DTD,?3.0??是 DTD 的版本,?EN??表示語言為英文。
?
- ?http://mybatis.org/dtd/mybatis-3-mapper.dtd?:指定 DTD 文件的位置,MyBatis 解析器會通過該 URL 驗證 XML 內容是否符合 Mapper 文件的語法規則(如標簽、屬性是否合法)。

?<mapper namespace="com.example.demo.mapper.UserInfoMapper">

?- 作用:定義 Mapper 的命名空間(namespace),是 MyBatis 中非常關鍵的配置。
?
- 解釋:
?
- ?namespace??的值通常與對應的 Mapper 接口全類名一致(如這里的 ?com.example.demo.mapper.UserInfoMapper??,假設存在同名 Java 接口)。
?
- 作用:
?
- 綁定接口:MyBatis 會通過命名空間關聯對應的 Mapper 接口,接口中的方法與 XML 中 ?<select>?、?<insert>??等標簽的 ?id??一一映射,實現接口方法到 SQL 的關聯。
?
- 避免 SQL 沖突:不同 Mapper XML 中即使有相同 ?id??的 SQL 標簽,只要命名空間不同,就不會沖突,保證 SQL 定義的唯一性。

返回的數據類型是實體類的類型,而不是List<T>這樣的,要的是返回所包含的類型。?

增(Insert)

UserInfoMapper接?:

xml格式,可以隨意的換行,還是視為同一條指令的。

刪(Delete)

改(Update)

查(Select)

resultType換成了resultMap

這個映射可以多次使用

其他查詢操作

多表查詢

多表查詢和單表查詢類似, 只是SQL不同?已
準備?作
上?建了?張??表, 我們再來建?張?章表, 進?多表關聯查詢.
?章表的uid, 對應??表的id.

?

多表查詢實際上和單表查詢沒有區別,需要的是創建另外的實體類,能夠接收查詢到的數據,雖然可以直接包含其他的實體類,但建議還是另外加上基礎類型。

多表查詢的問題

實際開發中最好不要用多表查詢,因為這會導致一種慢查詢的現象,在mysql查詢中,每一個查詢都需要mysql線程池中的一個線程,多表查詢的時間必然比單表查詢要慢,那么就會導致占有線程的時間過長,導致其他業務不能及時的得到處理,這是非常致命的。所以建議還是將多表查詢細分為單表查詢,再通過程序員自身將單表查詢到的數據串聯起來,能夠有效的提升查詢效率,并且還能通過索引優化。

?

就像這里一樣,多表查詢是同時查詢兩張表并且將兩張表的數據段進行比較,而兩個單表查詢就可以先查詢出其中一張表的id,再通過這張表的id作為另外一張表的關聯字段 user_id這種作為where的查詢條件,就可以加快查詢速度。

#{} 和 ${}

MyBatis 參數賦值有兩種?式, 咱們前?使?了 #{} 進?賦值, 接下來我們看下?者的區別

#{} 和 ${}區別

結果依然被正確查詢出來了, 其中參數 or被當做了SQL語句的?部分,這是一種很危險的情況,代表了不需要密碼就可以直接訪問數據庫的數據。

排序功能

${}可以在那些參數較少,受限制,能夠校驗的場景下使用。

此之外, 還有表名作為參數時, 也只能使? ${}。

因為有時會有數據量過大,從而導致需要分表分庫的情況。?

like 查詢

數據庫連接池

在上?Mybatis的講解中, 我們使?了數據庫連接池技術, 避免頻繁的創建連接, 銷毀連接
下?我們來了解下數據庫連接池
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應?程序重復使??個現有的數據庫連接,?不是再重新建??個
學習?檔: https://github.com/alibaba/druid/wiki/%E9%A6%96%E9%A1%B5

總結

?MySQL 開發企業規范

#{} 和${} 區別?

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

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

相關文章

記一次jvm機器問題定位經歷

背景 開發過程中發現機器指標異常&#xff0c;端口也hang住無響應&#xff0c;端口返回為timeout&#xff0c;對應探活檢測也失敗了。 現象 在st測試環節&#xff0c;突然每隔一段時間新接口就hang住無響應&#xff0c;觀察機器監控也發現端口探活失敗&#xff0c;看機器指標…

【機器學習深度學習】張量基本操作

目錄 一、張量基本操作 1.1 執行代碼 1.2 運行結果 1.3 代碼解析 ? 1. 創建張量&#xff08;tensor、randn、zeros&#xff09; ? 2. 索引與切片&#xff08;類似 NumPy&#xff09; ? 3. 形狀變換&#xff08;reshape、轉置、壓縮&#xff09; ? 4. 數學運算&#x…

【微信小程序】8、獲取用戶當前的地理位置

1、獲取當前的地理位置 獲取當前的地理位置、速度。當用戶離開小程序后&#xff0c;此接口無法調用。開啟高精度定位&#xff0c;接口耗時會增加&#xff0c;可指定 highAccuracyExpireTime 作為超時時間。 注意&#xff1a; 地圖相關使用的坐標格式應為 gcj02。高頻率調用會…

Jenkins 常用定時構建腳本

Jenkins 常用定時構建腳本 Jenkins 使用 cron 風格的語法來配置定時構建任務&#xff0c;以下是常用的定時構建腳本示例和說明&#xff1a; 基本語法 Jenkins 定時構建使用五個字段表示時間&#xff0c;格式為&#xff1a; MINUTE HOUR DOM MONTH DOWMINUTE - 分鐘 (0-59)H…

ActiveMQ漏洞復現

以下內容均在nextcyber靶場環境中完成&#xff0c;請勿用于非法途徑&#xff01; ActiveMQ 反序列化漏洞&#xff08;CVE-2015-5254&#xff09; Apache ActiveMQ是美國阿帕奇&#xff08;Apache&#xff09;軟件基金會所研發的一套開源的消息中間件&#xff0c;它支持Java消息…

環保處理設備遠程運維管理解決方案

在環保產業蓬勃發展的當下&#xff0c;環保處理設備廠商面臨著愈發激烈的市場競爭。為助力環保處理設備廠商在競爭中脫穎而出&#xff0c;御控工業智能網關打造了一套完善的PLC數據采集設備運維管理平臺解決方案。此方案憑借其獨特優勢&#xff0c;能為環保處理設備廠商帶來顯著…

嵌入式學習筆記DAY43(ARM架構)

一、RAM分類 sram&#xff08;靜態隨機存取存儲器&#xff09;&#xff1a; 原理&#xff1a;使用晶體管來存儲二進制數據0和1&#xff0c;通過雙穩態電路&#xff08;由多個晶體管組成&#xff09;來保持數據狀態&#xff0c;只要持續供電&#xff0c;數據就能穩定保存。數據讀…

2025國際無人機應用及防控大會四大技術專題深度解析

2025國際無人機應用及防控大會四大技術專題深度解析 2025國際無人機應用及防控大會四大技術專題深度解析1 無人機系統技術專題技術特點與應用領域國內領軍企業及案例風險挑戰與發展方向 2 測控與通信導航技術專題技術創新與應用突破領先企業及解決方案現存問題與發展趨勢 3 任務…

DD3118S:USB3.0+Type-c雙頭TF/SD二合一高速0TG多功能手機讀卡器ic

DD3118S封裝是QFN42, GL3224封裝是QFN32 &#xff0c;設計同樣一款3.0讀卡方案&#xff0c;GL3213S需要電容、電阻外圍器件一起要29顆&#xff0c;而DD3118S只需要13顆&#xff0c;方案精簡且設計簡單 DD3118S支持USB3.0Type-c雙頭TF/SD二合一 &#xff0c;高速0TG多功能手機讀…

如何在FastAPI中玩轉GitHub認證,讓用戶一鍵登錄?

title: 如何在FastAPI中玩轉GitHub認證,讓用戶一鍵登錄? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: cmdragon excerpt: GitHub第三方認證集成通過OAuth2.0授權碼流程實現,包含用戶跳轉GitHub認證、獲取授權碼、交換訪問令牌及調用API獲取用戶信息四…

深入JVM:從零到實戰,解鎖Java性能與調優的終極武器

“什么&#xff1f;你還在寫CRUD&#xff1f;面試官問個JVM調優直接啞火&#xff1f;線上服務OOM了只能重啟大法&#xff1f;” —— 別慌&#xff0c;掌握JVM&#xff0c;你也能成為團隊里的“定海神針”&#xff01; 作為一名Java開發者&#xff0c;無論你是剛入行的新人還是…

MyBatis 中的 resultType 與 resultMap:區別、使用場景及示例詳解

目錄 一、什么是 resultType 1. 定義 2. 特點 3. 使用場景 4. 示例 示例 1&#xff1a;返回一個實體類對象 對應的 Java 類&#xff1a; 示例 2&#xff1a;返回 Map 集合 返回的每個記錄是一個 Map&#xff0c;例如&#xff1a; 二、什么是 resultMap 1. 定義 2. …

Mac安裝Apache CXF的時候報錯:/Library/Internet: No such file or directory

該問題的原因因為配置的JAVA_HOME環境變量路徑中的包括空格字符導致的錯誤。 一、問題排查 輸出當前環境變量 $JAVA_HOME的路徑地址&#xff0c;觀察路徑中是否存在空格 echo $JAVA_HOME二、問題解決 將JAVA_HOME路徑改為你安裝的jdk路徑&#xff0c;注意你的版本號可能與我的會…

npm(或pnpm)時報:證書過期 certificate has expired問題

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 首先安裝pnpm npm install -g pnpm //檢查安裝成功的版本 pnpm -v 在拉芋道管理系統&#xff0c;安裝依賴pnpm i 時報證書過期 更改了鏡像也一樣 解決方案&#xff1a; 提示&#xff1a;這里填寫該…

回歸預測 | Matlab實現KAN神經網絡多輸入單輸出回歸預測模型

回歸預測 | Matlab實現KAN神經網絡多輸入單輸出回歸預測模型 目錄 回歸預測 | Matlab實現KAN神經網絡多輸入單輸出回歸預測模型效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 KAN作為這兩年最新提出的機制&#xff0c;目前很少人用&#xff0c;很適合作為預測的創新點&…

人生筆記Real:記錄生活點滴,守護珍貴記憶

在快節奏的現代生活中&#xff0c;我們常常會有一些瞬間的靈感、難忘的經歷或者需要記錄的重要事項。然而&#xff0c;如何高效地記錄這些內容&#xff0c;并確保它們不會隨著時間的流逝而丟失&#xff0c;成為了一個值得思考的問題。《人生筆記Real》正是這樣一款簡單好用的筆…

自動駕駛數據特征提取實戰:用Python打開智能駕駛的新視角

自動駕駛數據特征提取實戰:用Python打開智能駕駛的新視角 聊起自動駕駛,很多朋友第一時間想到的可能是“車上的攝像頭多牛,傳感器多先進”,但讓我告訴你,真正決定自動駕駛“大腦”能不能跑得順暢、跑得準的,是數據的“骨頭”—特征。 沒錯,機器學習、深度學習的基礎都…

從零搭建共享棋牌室物聯網系統:硬件選型與避坑指南!

近來&#xff0c;24小時共享棋牌室憑借“低成本、無人化、高坪效”的特點成為創業熱點。但許多項目在硬件選型階段就踩坑不斷——設備不兼容、安裝返工、售后無門等問題頻發。本文將結合實戰經驗&#xff0c;手把手教你從零搭建穩定可靠的棋牌室物聯網硬件系統&#xff0c;并附…

NPM 依賴包版本號 `~` 和 `^` 的區別及最佳實踐

本文將深入淺出地解釋 ~ 與 ^ 在 package.json 中的含義&#xff0c;并結合實際開發流程給出團隊協作與發布上線的最佳版本管理策略。 一、版本號的基本結構 NPM 依賴的版本號遵循 SemVer&#xff08;語義化版本&#xff09; 標準&#xff1a; 主版本號.次版本號.補丁號Major…

uniapp報錯Cannot read property ‘dataset‘ of null

如果你引入的組件在uniapp分包路徑中&#xff0c;就會報錯