一、參考文檔
官網:http://mp.baomidou.com/
參考教程:http://mp.baomidou.com/guide/
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上隻做增強不做改變,為簡化 開發、提高效率而生。
快速開始參考:http://mp.baomidou.com/guide/quick-start.html
測試項目: mybatis_plus
資料庫:mybatis_plus
二、資料庫準備工作
先建立<code>mybatis_plus</code>資料庫
在内運作腳本
插入資料
結果:
三、流程:
導入依賴
資料源配置
建立pojo類
建立包 mapper 編寫Mapper 接口
測試
四、添加日志操作
配置資訊
出現日志
五、insert操作
六、主鍵政策
MyBatis-Plus預設的主鍵政策是:ID_WORKER 全局唯一ID 參考資料:分布式系統唯一ID生成方案彙總:javascript:void(0)
建立資料庫時設定id自增
建立pojo類時
七、更新資料操作
什麼是樂觀鎖: 是一種解決方案,主要解決多人并發操作時更新丢失問題,對應mysql事務的隔離性 悲觀鎖: 與樂觀鎖對應都是解決多人并發操作時的更新丢失問題,但時悲觀鎖是串行的,簡單來說就是我操作資料庫的時候别人不能操作資料庫
主要适用場景:當要更新一條記錄的時候,希望這條記錄沒有被别人更新,也就是說實作線程安全的資料更新
樂觀鎖實作方法:
取出記錄時,擷取目前version
更新時,帶上這個version
執行更新時, set version = newVersion where version = oldVersion
如果version不對,就更新失敗
在資料庫中添加版本字段
pojo類中
需要在字段自動填充中初始化版本号
然後就直接測試了
但注意,一定要遵守<code>先查後改</code>的原則,在查的時候得到包含了version資訊的user對象,在更新的時候就會去找到這個版本号,确認是否對應,如果一緻然後才更新,否則更新失敗,而且再更新user時會對version進行+1操作
可見mp的樂觀鎖主要解決從查到資料到更新資料途中是否有其他人或其他線程修改了資料
八、自動填充
比如建立時間和更新時間需要自動填充就會很友善
建立資料庫時添加兩個字段
在pojo類中
建立handle包下面建立一個元件
九、查詢操作
MyBatis Plus自帶分頁插件,隻要簡單的配置即可實作分頁功能
需要添加一個bean到IOC容器中去
再分頁查詢
十、删除操作
實體删除:真實删除,将對應資料從資料庫中删除,之後查詢不到此條被删除資料
邏輯删除:假删除,将對應資料中代表是否被删除字段狀态修改為“被删除狀态”,之後在資料庫中仍 舊能看到此條資料記錄
在資料庫中添加deleted字段
pojo中操作
用自動填充來初始化deleted值
配置Bean元件
測試:
注意:内部的sql語句包含了where deleted = 0,是以沒有初始化deleted為0的話是删除不了的,會找不到這個資料
測試删除之後的查詢:
MyBatis Plus中查詢操作也會自動添加邏輯删除字段的判斷
邏輯層的删除資料也查不到了
十一、性能分析插件
性能分析攔截器,用于輸出每條 SQL 語句及其執行時間 SQL 性能執行分析,開發環境使用,超過指定時間,停止運作。有助于發現問題
主要用于開發環境
加一個配置bean即可
十二、wrapper實作複雜查詢
Wrapper : 條件構造抽象類,最頂端父類
AbstractWrapper : 用于查詢條件封裝,生成 sql 的 where 條件
QueryWrapper : Entity 對象封裝操作類,不是用lambda文法
UpdateWrapper : Update 條件封裝,用于Entity對象更新操作
AbstractLambdaWrapper : Lambda 文法使用 Wrapper統一處了解析 lambda 擷取 column。
LambdaQueryWrapper :看名稱也能明白就是用于Lambda文法使用的查詢Wrapper
LambdaUpdateWrapper : Lambda 更新封裝Wrapper
大于等于、大于、小于等于、小于、為空、非空
對應sql:
等于、不等于
所有條件全部一緻
in、notIn:
notIn("age",{1,2,3})--->age not in (1,2,3)
notIn("age", 1, 2, 3)--->age not in (1,2,3)
inSql、notinSql:可以實作子查詢
例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)
這裡使用了lambda表達式,or中的表達式最後翻譯成sql時會被加上圓括号
直接拼接到 sql 的最後
隻能調用一次,多次調用以最後一次為準 有sql注入的風險,請謹慎使用
最終的sql會合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段