重生之我在暑假學習微服務第二天《MybatisPlus-下篇》

本系列參考黑馬程序員微服務課程,有興趣的可以去查看相關視頻,本系列內容采用漸進式方式講解微服務核心概念與實踐方法,每日更新確保知識點的連貫性。通過系統化學習路徑幫助開發者掌握分布式系統構建的關鍵技術。讀者可通過平臺訂閱功能獲取最新章節推送,及時了解服務拆分、容器化部署、服務網格等前沿技術動態。
?

  • ?個人主頁: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_deletedstatus)標識記錄是否“已刪除”,實際數據仍保留在數據庫中。

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)替代。

注意事項
  • 處理器需通過 MybatisPlusInterceptoraddInnerInterceptor 方法添加
  • 多個攔截器按添加順序執行
  • 部分處理器需配合注解或實體類字段使用

可以看到處理器的類型十分豐富,這里給大家詳解一下以下兩個處理器的使用

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的優勢,構建高效、可維護的應用程序。

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

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

相關文章

系統整理Python的條件語句和常用方法

Python 的條件語句&#xff08;if 語句&#xff09;是控制程序流程的基礎之一&#xff0c;結構清晰、語法簡潔&#xff0c;非常適合初學者掌握。一、基本語法結構if 條件:執行代碼塊1 elif 條件2:執行代碼塊2 else:執行代碼塊3示例&#xff1a;score 85if score > 90:print…

記錄個IAR程序下載后硬件復位不運行,必須斷電復位才運行的問題

【問題測試】有個F407的跑馬燈的例子&#xff0c;是MDK和IAR兩個版本&#xff0c;MDK版本的例子下載并復位后可以正常看到LED閃爍&#xff0c;而IAR的例子下進去后&#xff0c;不會閃爍。使用TOOL的上位機內核寄存器監測工具測試發現&#xff0c;硬件復位后竟然還在調試狀態&am…

觀察者模式(Observer Pattern)和 發布-訂閱模式(Publisher-Subscriber Pattern)

你對 觀察者模式&#xff08;Observer Pattern&#xff09;和 發布-訂閱模式&#xff08;Publisher-Subscriber Pattern&#xff09;的描述是非常準確的&#xff0c;并且闡明了它們的核心區別。為了幫助你更好地理解這兩者的細微差異&#xff0c;下面是一個更詳細的對比分析&am…

2025年接口技術的十字路口:當MCP遇見REST、GraphQL與gRPC

在當今這個由數據驅動、萬物互聯的時代&#xff0c;應用程序接口&#xff08;API&#xff09;已成為現代軟件架構的基石。它們是不同服務之間溝通的橋梁&#xff0c;支撐著從網頁應用到復雜的微服務生態系統的一切。長久以來&#xff0c;開發者們在REST、GraphQL和gRPC這幾種主…

【CTF-WEB-反序列化】利用__toString魔術方法讀取flag.php

題目 頁面提示輸入?code&#xff0c;那我們在網址里get一下出現了新頁面的提示&#xff0c;進入看看下面有個help.php頁面的提示&#xff0c;進入看看有一段php代碼&#xff0c;仔細分析&#xff0c;應該是要用反序列法代碼如下 class FileClass{ public $filename error.log…

在 github.com 與 sourceforge.net 上創建免費個人靜態網站、博客的區別

github.com github 屬于 git 版本管理專業網站&#xff0c;有免費和收費兩種套餐。git 的數據是存放在數據庫中的&#xff0c;要將數據庫中的數據顯示為網站的網頁&#xff0c;這需要服務器端提供專門的中間件支持才能實現。 特點&#xff1a; 官方支持&#xff1a;提供長期…

jenkins 入門指南:從安裝到啟動的完整教程

jenkins 入門指南&#xff1a;從安裝到啟動的完整教程 持續集成&#xff08;CI&#xff09;是現代開發流程中的核心環節&#xff0c;而 Jenkins 作為一款開源的 CI 工具&#xff0c;憑借簡單安裝、開箱即用、插件豐富、易于擴展等優勢&#xff0c;成為開發者的首選工具。它能自…

機器學習(重學版)基礎篇(概念與評估)

本篇參考周志華老師的西瓜書&#xff0c;但是本人學識有限僅能理解皮毛&#xff0c;如有錯誤誠請讀友評論區指正&#xff0c;萬分感謝。一、基礎概念與評估方法本節目標&#xff1a;建立理論基礎框架?1、機器學習定義機器學習是一門通過計算手段利用經驗&#xff08;以數據形式…

spring/springboot SPI(二)配合使用的接口

spring.factories 里&#xff0c;Spring 會根據接口來加載實現類&#xff0c;常見的幾個接口包括&#xff1a;一、org.springframework.context.ApplicationListener1、作用監聽 Spring 容器事件&#xff0c;如 ApplicationReadyEvent。2、使用方法項目結構Spring Boot 2.xSpri…

基于Zig語言,opencv相關的c++程序靜態交叉編譯

一、寫在前面 1.什么是zig? Zig 是一種通用編程語言&#xff1b; Zig 最初的定位就是代替C語言的系統級語言&#xff0c;它提供了與 C 語言幾乎 100% 兼容&#xff08;可直接調用 C 頭文件、鏈接 C 庫&#xff09;&#xff0c;同時不需要任何依賴構建系統。 Zig 同時附帶一…

基于 LSTM 與 SVM 融合的時間序列預測模型:理論框架與協同機制—實踐算法(1)

目錄 1、單一模型的局限性&#xff1a;混合架構的設計動機 2、LSTM 的時序特征提取&#xff1a;從原始序列到高階表征 2.1、門控機制的時序過濾能力 2.2、隱藏狀態的特征壓縮作用 2.3、預訓練的特征優化邏輯 3、SVM 的非線性映射&#xff1a;從高階特征到預測輸出 3.1、…

如何查看docker實例是否掛載目錄,以及掛載了哪些目錄

一條命令即可一次性列出當前容器里所有掛載點&#xff1a; docker inspect <容器ID或名稱> --format{{range .Mounts}}{{printf "%-8s %-35s -> %s\n" .Type .Source .Destination}}{{end}}示例輸出&#xff1a; bind /host/owrt/src …

Opentrons 模塊化平臺與AI技術助力智能移液創新,賦能AAW?自動化工作站

在生命科學領域加速擁抱自動化的關鍵節點&#xff0c;全球開源實驗室自動化領導者 Opentrons 攜手全球領先生命科學公司默克生命科學&#xff0c;重磅推出 AAW?智能自動化液體處理平臺。這一戰略合作的核心技術引擎 ——Opentrons Flex 第三代全自動移液工作站&#xff0c;正以…

C++學習筆記(八:函數與變量)

往篇內容&#xff1a; C學習筆記&#xff08;一&#xff09; 一、C編譯階段※ 二、入門案例解析 三、命名空間詳解 四、C程序結構 C學習筆記&#xff08;二&#xff09; 五、函數基礎 六、標識符 七、數據類型 補充&#xff1a;二進制相關的概念 sizeof 運算符簡介 補…

智慧施工:施工流程可視化管理系統

圖撲智慧施工全流程可視化管理系統&#xff0c;通過可視化界面&#xff0c;可直觀掌握各工序銜接進度、資源調配情況&#xff0c;快速識別違規作業、設備故障等風險點 —— 如塔吊運行半徑重疊、深基坑支護位移預警等。同時&#xff0c;系統支持施工方案模擬推演&#xff0c;對…

單鏈表的冒泡排序實現:從原理到代碼詳解

單鏈表的冒泡排序實現&#xff1a;從原理到代碼詳解 引言 單鏈表作為一種常見的數據結構&#xff0c;其排序操作因節點無法隨機訪問&#xff08;需通過指針遍歷&#xff09;而與數組排序存在差異。冒泡排序因其實現簡單、無需額外空間&#xff08;僅需指針操作&#xff09;&…

如何在 Ubuntu 24.04 或 22.04 上安裝和使用 GDebi

APT 是 Ubuntu 上安裝需要外部依賴項的 Debian 包的一種方式,但還有另一種選擇,即 GDebi。本文將介紹如何在 Ubuntu 24.04 上安裝 GDebi,以及如何使用它來安裝 .deb 包所需的依賴項。 什么是 GDebi? GDebi 是默認的 .deb 包安裝器 DPKG 的輕量級替代品。與 DPKG 不同,GD…

俄羅斯方塊游戲開發(面向對象編程)

摘要本設計基于MATLAB面向對象編程技術&#xff0c;開發了一款具備完整游戲邏輯的俄羅斯方塊游戲。通過類封裝實現游戲核心模塊&#xff08;方塊管理、游戲板狀態、碰撞檢測等&#xff09;&#xff0c;采用旋轉矩陣實現方塊變形&#xff0c;結合MATLAB圖形用戶界面&#xff08;…

背包DP之多重背包

背包DP之多重背包一、多重背包基礎認知1.1 問題定義1.2 核心特征二、基礎解法&#xff1a;暴力拆分2.1 核心思路2.2 代碼實現2.3 局限性分析三、優化解法&#xff1a;二進制拆分3.1 優化原理3.2 拆分步驟3.3 代碼實現3.4 復雜度分析四、二進制拆分過程五、多重背包的變種與應用…

Ansible 變量指南:聲明、優先級、作用域與最佳實踐(一)

Ansible 變量的聲明 前言 全面理解 Ansible 變量是編寫高效、可維護 Playbook 的關鍵。由于最近使用 Ansible 比較多&#xff0c;在變量問題上踩了不少坑&#xff0c;也因此對變量的聲明&#xff0c;優先級和作用域有了更深的理解。姑且總結一下&#xff0c;分享給大家&#…