本系列參考黑馬程序員微服務課程,有興趣的可以去查看相關視頻,本系列內容采用漸進式方式講解微服務核心概念與實踐方法,每日更新確保知識點的連貫性。通過系統化學習路徑幫助開發者掌握分布式系統構建的關鍵技術。讀者可通過平臺訂閱功能獲取最新章節推送,及時了解服務拆分、容器化部署、服務網格等前沿技術動態。
?
- ?個人主頁:VON
- 文章所屬專欄:微服務
- 系列文章鏈接:重生之我在暑假學習微服務第一天《MybatisPlus-上篇》-CSDN博客
- 時間:每天12點準時更新
特別聲明:本篇文章對應黑馬程序員微服務課程P11-P20?
目錄
前言?
一、安裝插件
MyBatis-Plus 插件的意義
1.找到idea中的插件
2.在插件市場中搜索MyBatisPlus插件
3. 配置所需信息
4. 配置成自己的
5.接下來就可以直接使用了
6.開始生成
二、DB靜態工具
測試一:改造根據id查詢
1.先導入AddressVO
?2.在UserVO中添加AddressVO字段?編輯
3.開始修改代碼
4.用Apifox測試
測試二:改造根據id批量查詢?
1.還是先改造Controll層代碼
?2.實現方法
3.解釋方法
(1)查詢用戶基本信息
(2)查詢用戶地址信息
(3)地址信息處理和分組
(4)封裝最終結果
4、測試結果
三、邏輯刪除
1.先配置邏輯刪除相關語句
2.新建一個測試
?3.測試結果
4.查看數據庫表結構?
四、處理器
MyBatis-Plus 中的處理器
元對象處理器(MetaObjectHandler)
分頁插件處理器(PaginationInnerInterceptor)
動態表名處理器(DynamicTableNameInnerInterceptor)
樂觀鎖處理器(OptimisticLockerInnerInterceptor)
SQL 注入處理器(AbstractSqlInjector)
性能分析處理器(PerformanceInterceptor)
注意事項
1、枚舉處理器
(1)新建一個枚舉文件來存放枚舉類型
(2)配置枚舉處理器?編輯
?(3)修改實體類
?(4)修改代碼
(5)測試?
2、JSON處理器
五、分頁插件
1、先配置實體類
2、測試
?六、分頁查詢案例
1、先創建實體類?
?編輯?2、用戶繼承該實體類
3、定義返回結果
?4、開始測試
mybatisplus篇結尾
總結與展望
?
前言?
窗外的蟬鳴又起時,VON 的筆記本已經寫滿半本。晨光漫過屏幕,照亮他眼下淡淡的青黑 —— 凌晨三點才在代碼調試成功的提示音里睡去,七點卻被生物鐘拽醒。?
他點開《MyBatisPlus 基礎入門》的第三章,指尖在手機屏幕上飛快滑動。@TableName 注解那頁還粘著昨晚吃泡面時濺的湯漬,此刻倒成了醒目的標記。"原來實體類和數據庫表名不一致時,加這個注解就能映射..." 他對著示例敲下代碼,看著控制臺彈出的 "查詢成功" 提示,突然想起前世寫的那堆冗長 SQL,耳根發燙。?
條件構造器是塊硬骨頭。QueryWrapper 的嵌套查詢讓他卡了整整兩小時,報錯信息像密集的螞蟻爬滿屏幕。窗外的蟬鳴又開始聒噪,他抓著頭發盯著那句 "LambdaQueryWrapper lqw = new LambdaQueryWrapper<>()",忽然想起班長發的資料里提過" 鏈式調用更直觀 "。指尖在鍵盤上重新跳躍,當根據年齡和性別篩選出的用戶列表整齊排列在控制臺時,他狠狠捶了下桌面,震得馬克杯里的速溶咖啡泛起漣漪。?
自定義 SQL 部分倒意外順利。或許是前世被冗余代碼折磨出的本能,當他在 XML 文件里寫出帶條件判斷的動態 SQL 時,竟有種莫名的熟悉感。陽光穿過紗窗在代碼上投下格子影,他忽然發現,那些曾經讓他望而生畏的尖括號,此刻正像列隊的士兵般溫順。?
下午三點,Service 接口的批量新增測試成功。看著一百條用戶數據瞬間寫入數據庫,VON 摸出手機翻到游戲群,前世此刻他本該在喊 "開團"。群里依舊熱鬧,他卻平靜地點了退出。?
最后一行代碼運行結束時,晚霞正把天空染成橘紅色。VON 合上筆記本,發現封面上的倒影里,自己的眼睛比昨天更亮了些。蟬鳴漸歇的暮色里,他仿佛聽見未來的自己敲代碼的聲音,清脆又篤定。
至此,MybatisPlus篇完結!!!
一、安裝插件
MyBatis-Plus 插件的意義
MyBatis-Plus(簡稱 MP)是基于 MyBatis 的增強工具插件,旨在簡化開發、提升效率。其核心意義在于為 MyBatis 提供更便捷的功能擴展,同時保持與原生 MyBatis 的無縫兼容。
1.找到idea中的插件
2.在插件市場中搜索MyBatisPlus插件
3. 配置所需信息
4. 配置成自己的
?
這里測試的時候報錯了,問了下豆包,說是時區問題。
The server time zone value '���??��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.?
修改方案:
這樣就表示成功了?
5.接下來就可以直接使用了
可以看到這里出現的表正是我們數據庫中的表
6.開始生成
配置成我這樣就可以
?出現這個標志就成功了
這些全都是這個插件生成的代碼?
?
二、DB靜態工具
DB靜態工具是指用于數據庫設計、分析、優化的非運行時工具,通常在數據庫開發或維護階段使用。這類工具不直接與運行中的數據庫交互,而是通過靜態分析數據結構、SQL腳本或元數據來提供支持。
測試一:改造根據id查詢
1.先導入AddressVO
?2.在UserVO中添加AddressVO字段
3.開始修改代碼
?原UserController
?現UserController
?實現方法
4.用Apifox測試
測試成功
測試二:改造根據id批量查詢?
1.還是先改造Controll層代碼
?2.實現方法
@Overridepublic List<UserVO> queryUsersAndAddressByIds(List<Long> ids) {//1.查詢用戶List<User> users = listByIds(ids);if(CollUtil.isEmpty(users)){return Collections.emptyList();}//2.查詢地址//獲取id集合List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());List<Address> address = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();List<AddressVO> addressVOList = BeanUtil.copyToList(address, AddressVO.class);Map<Long, List<AddressVO>> addressMap = addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId));//3.封裝VOList<UserVO> userVOList = BeanUtil.copyToList(users, UserVO.class);userVOList.forEach(userVO -> {userVO.setAddress(addressMap.get(userVO.getId()));});return userVOList;}
3.解釋方法
這個方法有點復雜了,這里解釋一下相關步驟
(1)查詢用戶基本信息
List<User> users = listByIds(ids);
if(CollUtil.isEmpty(users)){return Collections.emptyList();
}
- 使用 listByIds(ids) 方法根據ID列表批量查詢用戶
- 如果查詢結果為空,則返回空列表
(2)查詢用戶地址信息
List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());
List<Address> address = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();
- 從查詢到的用戶列表中提取所有用戶ID
- 使用 Db.lambdaQuery() 構造查詢條件,通過 in 條件批量查詢這些用戶的所有地址信息
(3)地址信息處理和分組
List<AddressVO> addressVOList = BeanUtil.copyToList(address, AddressVO.class);
Map<Long, List<AddressVO>> addressMap = addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId));
- ?使用 BeanUtil.copyToList() 將 Address 對象列表轉換為 AddressVO 對象列表
- 使用 Collectors.groupingBy() 按用戶ID對地址進行分組,形成 Map<用戶ID, 地址列表> 的結構
(4)封裝最終結果
List<UserVO> userVOList = BeanUtil.copyToList(users, UserVO.class);
userVOList.forEach(userVO -> {userVO.setAddress(addressMap.get(userVO.getId()));
});
return userVOList;
- 將用戶信息轉換為 UserVO 對象列表
- 遍歷每個 UserVO 對象,從 addressMap 中獲取對應用戶ID的地址列表并設置到 UserVO 中
- 返回封裝好的用戶VO列表
4、測試結果
可以看到可以正常查詢
三、邏輯刪除
邏輯刪除是一種數據管理方式,通過標記記錄的狀態而非物理刪除數據。通常通過添加一個字段(如?is_deleted
、status
)標識記錄是否“已刪除”,實際數據仍保留在數據庫中。
1.先配置邏輯刪除相關語句
2.新建一個測試
?3.測試結果
4.查看數據庫表結構?
?不難看出這里的deleted字段變成了true,說明已經被邏輯刪除掉了
四、處理器
MyBatis-Plus 中的處理器
MyBatis-Plus 提供了多種處理器(Handler)用于擴展或定制框架行為,主要分為以下幾類:
元對象處理器(MetaObjectHandler)
用于自動填充公共字段(如創建時間、更新時間、操作人等)。通過實現 MetaObjectHandler
接口并重寫以下方法:
@Override
public void insertFill(MetaObject metaObject) {// 插入時自動填充字段this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}@Override
public void updateFill(MetaObject metaObject) {// 更新時自動填充字段this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
需通過 @Component
注解注冊為 Spring Bean。
分頁插件處理器(PaginationInnerInterceptor)
用于實現物理分頁功能,需通過配置類啟用:
@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}
支持多種數據庫方言,自動識別并轉換分頁語句。
動態表名處理器(DynamicTableNameInnerInterceptor)
用于動態替換表名,適用于分表場景:
DynamicTableNameInnerInterceptor interceptor = new DynamicTableNameInnerInterceptor();
interceptor.setTableNameHandler((sql, tableName) -> {return "實際表名邏輯";
});
樂觀鎖處理器(OptimisticLockerInnerInterceptor)
通過版本號實現樂觀鎖,需在實體類字段添加 @Version
注解:
@Version
private Integer version;
配置攔截器后,更新操作會自動檢測版本號一致性。
SQL 注入處理器(AbstractSqlInjector)
用于自定義全局 SQL 方法,需繼承 AbstractSqlInjector
并實現 inspectInject
方法:
public class CustomSqlInjector extends AbstractSqlInjector {@Overridepublic List<AbstractMethod> getMethodList() {return Stream.of(new InsertBatchSomeColumn()).collect(Collectors.toList());}
}
性能分析處理器(PerformanceInterceptor)
已廢棄,推薦使用第三方監控工具(如 P6Spy)替代。
注意事項
- 處理器需通過
MybatisPlusInterceptor
的addInnerInterceptor
方法添加 - 多個攔截器按添加順序執行
- 部分處理器需配合注解或實體類字段使用
可以看到處理器的類型十分豐富,這里給大家詳解一下以下兩個處理器的使用
1、枚舉處理器
(1)新建一個枚舉文件來存放枚舉類型
(2)配置枚舉處理器
?(3)修改實體類
?(4)修改代碼
將出現的狀態碼都修改一下
UserVO實體類也要改一下?
(5)測試?
測試一下觀察返回值?
這里返回值變成了枚舉類型的,這可不是我們想要的結果
?解決方案也很簡單,只需要添加這么一個注解即可
?
可以看到這是展現的就是我們預期的效果了?
2、JSON處理器
JSON 處理器是一種用于解析、生成、轉換和操作 JSON(JavaScript Object Notation)數據的工具或庫。其核心功能包括:
- 解析:將 JSON 字符串轉換為編程語言中的數據結構(如對象、字典、數組等)。
- 序列化:將內存中的數據結構轉換為 JSON 字符串。
- 查詢與修改:支持路徑查詢(如 JSONPath)、節點增刪改查等操作。
- 驗證:檢查 JSON 數據是否符合特定模式(如 JSON Schema)。
- 格式化:美化或壓縮 JSON 字符串以提高可讀性或傳輸效率。
先創建實體類
注:要和表中數據保持一致?
?這里的字段也要加一下注解
?
添加這一字段
這里也要修改一下,凡是涉及到的都要修改
?就像這樣的,都要修改為上面那種
?UserVO實體類也要改
改為UserInfo
測試
不難看出這里的info字段變成了json格式
五、分頁插件
分頁插件是一種用于將大量數據分割成多個頁面的工具,通常用于網頁或應用程序中,以提高數據加載效率和用戶體驗。它允許用戶通過導航按鈕(如上一頁、下一頁、頁碼跳轉)瀏覽不同頁面的數據,避免一次性加載全部內容。
1、先配置實體類
2、測試
注意一下這里的page包,別導入錯了
這里當時添加數據后忘記刪除了
可以看到我們設置的每頁2條數據,5條數據正好三頁。
?六、分頁查詢案例
1、先創建實體類?
?2、用戶繼承該實體類
3、定義返回結果
?
?4、開始測試
service層代碼
@Overridepublic PageDTO<UserVO> queryUsersPage(UserQuery query) {String name = query.getName();Integer status = query.getStatus();Page<User> page = new Page<>(query.getPageNo(), query.getPageSize());if(StrUtil.isNotBlank(query.getSortBy())){//不為空page.addOrder(new OrderItem(query.getSortBy(), query.getIsAsc()));}else{page.addOrder(new OrderItem("update_time", false));}Page<User> p = lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).page( page);//封裝PageDTO<UserVO> dto = new PageDTO<>();dto.setTotal(p.getTotal());dto.setPages(p.getPages());List<User> records = p.getRecords();if(records != null){List<UserVO> vos = BeanUtil.copyToList(records, UserVO.class);dto.setList(vos);}return dto;}
測試結果?
mybatisplus篇結尾
MyBatis-Plus作為一款強大的MyBatis增強工具,極大簡化了開發者的數據庫操作流程,提升了開發效率。通過自動生成代碼、內置通用Mapper和Service,開發者可以專注于業務邏輯的實現,減少重復性工作。
MyBatis-Plus支持多種數據庫,并提供豐富的查詢條件構造器,滿足復雜查詢需求。其強大的性能優化和靈活的插件機制,使得數據庫操作更加高效和安全。無論是新項目搭建還是舊項目改造,MyBatis-Plus都能提供便捷的解決方案。
在實際開發中,合理使用MyBatis-Plus的功能,可以顯著提升開發效率和代碼質量。結合Spring Boot等框架,能夠快速構建穩定可靠的企業級應用。持續關注MyBatis-Plus的更新和社區動態,能夠更好地利用其最新特性。
總結與展望
MyBatis-Plus的未來發展潛力巨大,隨著技術的不斷進步,更多實用功能將被引入。開發者應持續學習和實踐,充分利用MyBatis-Plus的優勢,構建高效、可維護的應用程序。