什么是MyBatis
MyBatis是?款優秀的 持久層 框架,?于簡化JDBC的開發。
MyBatis本是 Apache的?個開源項?iBatis,2010年這個項?由apache遷移到了google code,并
且改名為MyBatis 。2013年11?遷移到Github
創建項目時添加依賴
上面有提到?個詞:持久層
持久層:指的就是持久化操作的層, 通常指數據訪問層(dao), 是?來操作數據庫的.
MyBatis??
Mybatis操作數據庫的步驟:
準備?作
創建?程

Mybatis 是?個持久層框架, 具體的數據存儲和數據操作還是在MySQL中操作的, 所以需要添加
MySQL驅動
項??程創建完成后,?動在pom.xml?件中,導?Mybatis依賴和MySQL驅動依賴
版本會隨著SpringBoot 版本發?變化
SpringBoot 3.X對?MyBatis版本為3.X
?
數據準備


配置數據庫連接字符串


注意事項:
如果使? MySQL 是 5.x 之前的使?的是"com.mysql.jdbc.Driver",如果是?于 5.x 使?的 是“com.mysql.cj.jdbc.Driver”.
寫持久層代碼
單元測試
@SpringBootTest就是一個將運行環境交給這個測試類的注解,沒有這個注解,就沒法注入依賴這些操作,因為被管理的依賴都是在運行環境里的。
MyBatis的基礎操作
上?使用了Mybatis的查詢操作, 接下來學習MyBatis的增, 刪, 改操作
在學習這些操作之前, 我們先來學習MyBatis?志打印
打印?志

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

參數傳遞

但是這樣的話, 只能查找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 接口

添加 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
這個映射可以多次使用
其他查詢操作
多表查詢

?
多表查詢實際上和單表查詢沒有區別,需要的是創建另外的實體類,能夠接收查詢到的數據,雖然可以直接包含其他的實體類,但建議還是另外加上基礎類型。
多表查詢的問題
實際開發中最好不要用多表查詢,因為這會導致一種慢查詢的現象,在mysql查詢中,每一個查詢都需要mysql線程池中的一個線程,多表查詢的時間必然比單表查詢要慢,那么就會導致占有線程的時間過長,導致其他業務不能及時的得到處理,這是非常致命的。所以建議還是將多表查詢細分為單表查詢,再通過程序員自身將單表查詢到的數據串聯起來,能夠有效的提升查詢效率,并且還能通過索引優化。
?
就像這里一樣,多表查詢是同時查詢兩張表并且將兩張表的數據段進行比較,而兩個單表查詢就可以先查詢出其中一張表的id,再通過這張表的id作為另外一張表的關聯字段 user_id這種作為where的查詢條件,就可以加快查詢速度。
#{} 和 ${}



#{} 和 ${}區別

排序功能
${}可以在那些參數較少,受限制,能夠校驗的場景下使用。
此之外, 還有表名作為參數時, 也只能使? ${}。
因為有時會有數據量過大,從而導致需要分表分庫的情況。?
like 查詢
數據庫連接池




