目錄
🍃前言
🍀打印日志
🌴傳遞參數
🎋增(Insert)
🚩返回主鍵
🎄刪(Delete)
🌲改(Update)
🌳查(Select)
🚩起別名
🚩結果映射
🚩開啟駝峰命名(推薦使用)
🍃前言
首先我們準備相應的表如下:
application.yml配置文件內容如下:
UserInfo類代碼如下:
以下所有操作都是在該接口進行操作:所有測試單元代碼都是在如下代碼里面完成的:
🍀打印日志
在學習這些操作之前,我們先來學習MyBatis?志打印
在Mybatis當中我們可以借助?志,查看到sql語句的執?、執?傳遞的參數以及執?結果
在配置?件中進?配置即可
yml配置:
重新運?上述單元測試中的程序,可以看到SQL執?內容,以及傳遞參數和執?結果
未配置日志:
配置日志:
🌴傳遞參數
需求:查找id=1的??,對應的SQL就是:select * from userinfo where id=1
代碼:
但是這樣的話, 只能查找id=1的數據,所以SQL語句中的id值不能寫成固定數值,需要變為動態的數值 解決?案:在queryUserInfo?法中添加?個參數(id),將?法中的參數,傳給SQL語句
使? #{} 的?式獲取?法中的參數
代碼:
生成測試代碼:
運行結果:
注意:如果mapper接??法形參只有?個普通類型的參數,#{…}??的屬性名可以隨便寫,如:#{id}、#{value}。建議和參數名保持?致
如果有多個參數,屬性名一定要與參數名保持一致,當然也可以進行修改,具體方法后面會詳細講解
也可以通過 @Param ,設置參數的別名,如果使? @Param設置別名,#{...}??的屬性名必須和@Param 設置的?樣
代碼:
運行結果:
🎋增(Insert)
我們采用@Inset注解實現,具體實現如下:
返回Integer是為了知道對該數據庫更改了多少行。
這里由于傳遞參數過多,我們使用對象進行傳遞,對對象相應參數進行賦值即可。
我們使用測試單元進行測試,測試代碼如下:???????
啟動測試代碼,我們可以看到相應的日志:
再查詢相應的數據庫時我們就可以看到,添加成功的數據
如果設置了 @Param 屬性,#{...}需要使?參數.屬性來獲取
代碼:???????
運行結果:???????
🚩返回主鍵
Insert 語句默認返回的是受影響的?數
但有些情況下,數據插?之后,還需要有后續的關聯操作,需要獲取到新插?數據的id
?如訂單系統
當我們下完訂單之后,需要通知物流系統,庫存系統,結算系統等,這時候就需要拿到訂單ID
如果想要拿到?增id,需要在Mapper接?的?法上添加?個Options的注解
代碼:
useGeneratedKeys:這會令MyBatis使?JDBC的getGeneratedKeys?法來取出由數據庫內部?成的主鍵(?如:像MySQL和SQL Server這樣的關系型數據庫管理系統的?動遞增字段),默認值:false.
keyProperty:指定能夠唯?識別對象的屬性,MyBatis會使?getGeneratedKeys的返回值或insert語句的selectKey?元素設置它的值,默認值:未設置(unset)
也就是說把自增id放到了"id"屬性當做,現在可以通過獲取id屬性來打印自增id
測試:???????
運行結果:
🎄刪(Delete)
刪除代碼如下:
測試單元代碼如下:
運行結果如下:
查詢數據庫如下:
🌲改(Update)
將id為5的密碼改為000000,接口代碼如下:
更新代碼如下:
測試單元代碼如下:
啟動測試后,觀察日志如下:
查詢數據庫如下:
🌳查(Select)
我們查詢所有數據,并用日志打印出來,代碼如下:
測試單元代碼如下:
單元測試執行如下:
注意事項:
MyBatis會根據?法的返回結果進?賦值.
?法?對象UserInfo接收返回結果,MySQL查詢出來數據為?條,就會?動賦值給對象.
?法?List接收返回結果,MySQL查詢出來數據為?條或多條時,也會?動賦值給List.
但如果MySQL查詢返回多條,但是?法使?UserInfo接收,MyBatis執?就會報錯.
從運?結果上可以看到,我們SQL語句中,查詢了delete_flag,create_time,update_time,但是這?個屬性卻沒有賦值.
這是什么原因呢“
當?動映射查詢結果時,MyBatis會獲取結果中返回的列名并在Java類中查找相同名字的屬性(忽略??寫)。這意味著如果發現了ID列和id屬性,MyBatis會將列ID的值賦給id屬性
但是由于數據庫與java命名規則不同,數據庫的蛇形將轉換成駝峰,所以無法識別。
解決方法有以下三種:
- 起別名
- 結果映射
- 開啟駝峰命名
🚩起別名
在SQL語句中,給列名起別名,保持別名和實體類屬性名?樣
再次運行查看???????
就可以看到對應屬性已經有值了
但是這種方式一般不推薦,因為相當于將這個工作交給數據庫來做了。會降低效率,且不可控
🚩結果映射
使用注解,以及相關操作如下:
測試結果:
如果其他SQL,也希望可以復?這個映射關系,可以給這個Results定義?個名稱
@Results注解里面還有一個id屬性,也就是給它起個名
此時就可以通過@ResultMap注解進行映射,也就是映射@Results中的id對應的value
🚩開啟駝峰命名(推薦使用)
通常數據庫列使?蛇形命名法進?命名(下劃線分割各個單詞),?Java屬性?般遵循駝峰命名法約定.為了在這兩種命名?式之間啟??動映射,需要將mapUnderscoreToCamelCase 設置為true。
application.yml配置如下:
僅限遵守兩種命名規則的轉換。
這時候我們直接使用查詢即可
代碼:
單元測試代碼:
運行結果:
已經進行了自動映射,字段全部進?正確賦值
注意:在表結構的設計中,必須要有三個字段,這是企業規范,這幾個字段哪怕業務不需要也要有,當前可能不用,防止后續要使用。數據庫的修改是一個非常麻煩的過程!
- 1. 自增Id
- 2. 創建日期(create_time,created_time叫什么名字不重要)
- 3. 更新日期(update_time叫什么名字不重要)