MyBatisPlus-03-擴展功能

文章目錄

  • 【README】
  • 【1】基于MyBatisPlus的代碼生成器
  • 【2】MyBatisPlus-DB靜態工具
    • 【2.1】使用MyBatisPlus的DB靜態工具查詢單個及多個用戶地址
      • 【查詢單個用戶的訪問效果】
      • 【查詢多個用戶的訪問效果】
  • 【3】邏輯刪除
    • 【3.1】代碼實現
  • 【4】枚舉處理器
    • 【4.1】代碼實現
  • 【5】JSON處理器
    • 【5.1】代碼實現

【README】

本文代碼參見: https://github.com/TomJourney/mybatis-plus-test

本文介紹MyBatisPlus擴展功能,如下;

  • 代碼生成;
  • 靜態工具;
  • 邏輯刪除;
  • 枚舉處理器;
  • json處理器;


【1】基于MyBatisPlus的代碼生成器

方法1:使用代碼生成代碼,官方文檔:https://baomidou.com/guides/new-code-generator/

或者使用MyBatisGenerator插件:https://www.cnblogs.com/marEstrelado/articles/15930280.html



【2】MyBatisPlus-DB靜態工具

1)引入DB靜態工具的原因:

  • 原因1:IService僅用于spring單例bean,若是工具類,則無法使用IService或ServiceImpl的接口;
  • 原因2:若存在一個請求需要查詢多張表,則可能存在IService實現類的springbean相互引用的問題;

所以引入DB靜態工具,使得工具類也可以使用MyBatisPlus提供的增刪改查api;

2)業務需求:

  • 需求1:改造根據id查詢用戶的接口,查詢用戶的同時,也查詢用戶對應地址;
  • 需求2:改造根據id批量查詢用戶的接口,查詢用戶的同時,查詢批量用戶對應的地址;


【2.1】使用MyBatisPlus的DB靜態工具查詢單個及多個用戶地址

【UseStaticApiRestfulUserController】

@RestController
@RequestMapping("/staticdb/restful/user")
@RequiredArgsConstructor
public class UseStaticApiRestfulUserController {private final MyBatisPlusUserService myBatisPlusUserService;private final UserConverter userConverter;// 查詢單個 @GetMapping(path = "/queryUserById/{id}", consumes = "application/json")public UserVO queryUserById(@PathVariable("id") Long id) {return myBatisPlusUserService.queryUserAndAddrById(id);}// 查詢多個 @GetMapping(path = "/queryUserByIds", consumes = "application/json")public List<UserVO> queryUserByIds(@RequestParam("ids") List<Long> ids) {return myBatisPlusUserService.queryUserAndAddrById(ids);}
}

【MyBatisPlusUserService】

@Service
@RequiredArgsConstructor
public class MyBatisPlusUserService extends ServiceImpl<UserMapper, UserPO> {private final UserConverter userConverter;private final UserAddrConverter userAddrConverter;    // 使用MyBatisPlus的DB工具查詢單個用戶地址public UserVO queryUserAndAddrById(Long id) {// 1 查詢用戶UserPO userPO = getById(id);// 2 查詢地址List<UserAddrPO> userAddrPOList = Db.lambdaQuery(UserAddrPO.class).eq(UserAddrPO::getUserId, id).list();UserVO userVO = userConverter.toUserVO(userPO);// 3 封裝地址到用戶if (!CollectionUtils.isEmpty(userAddrPOList)) {userVO.setUserAddrVOList(userAddrConverter.toUserAddrVOList(userAddrPOList));}return userVO;}// 使用MyBatisPlus的DB工具查詢多個用戶地址 public List<UserVO> queryUserAndAddrById(List<Long> ids) {// 1 查詢用戶列表List<UserVO> userVOList = userConverter.toUserVOList(listByIds(ids));// 2 查詢地址列表List<Long> dbUserIdList = userVOList.stream().map(UserVO::getId).collect(Collectors.toList());List<UserAddrPO> userAddrPOList = Db.lambdaQuery(UserAddrPO.class).in(UserAddrPO::getUserId, dbUserIdList).list();// 轉為map,其中key為用戶id,value為地址vo列表Map<Long, List<UserAddrVO>> userIdToUserAddrVOsMap =userAddrConverter.toUserAddrVOList(userAddrPOList).stream().collect(Collectors.groupingBy(UserAddrVO::getUserId));// 3 封裝地址到用戶if (!CollectionUtils.isEmpty(userVOList)) {userVOList.forEach(userVO->{userVO.setUserAddrVOList(userIdToUserAddrVOsMap.getOrDefault(userVO.getId(), Collections.emptyList()));});}return userVOList;}
}

【查詢單個用戶的訪問效果】

地址:get localhost:8081/staticdb/restful/user/queryUserById/1

{"id": 1,"name": "user1","mobilePhone": "17612342701","addr": "成都錦城三街101號","balance": 1.00,"userState": "1","userAddrVOList": [{"id": 1,"userId": 1,"addrInfo": "成都高新區大學路1號","addrType": "UNVS"},{"id": 3,"userId": 1,"addrInfo": "成都高新區大學路學府家園","addrType": "HOME"}]
}

【查詢多個用戶的訪問效果】

地址:get localhost:8081/staticdb/restful/user/queryUserByIds?ids=1,2

[{"id": 1,"name": "user1","mobilePhone": "17612342701","addr": "成都錦城三街101號","balance": 1.00,"userState": "1","userAddrVOList": [{"id": 1,"userId": 1,"addrInfo": "成都高新區大學路1號","addrType": "UNVS"},{"id": 3,"userId": 1,"addrInfo": "成都高新區大學路學府家園","addrType": "HOME"}]},{"id": 2,"name": "user2","mobilePhone": "110","addr": "成都錦城四街401號","balance": 2.00,"userState": "0","userAddrVOList": [{"id": 4,"userId": 2,"addrInfo": "成都高新區大學路學府家園201號","addrType": "HOME"},{"id": 5,"userId": 2,"addrInfo": "成都高新區大學路學府家園202號","addrType": "HOME"}]}
]


【3】邏輯刪除

使用文檔參見: https://baomidou.com/guides/logic-delete/

1)業務背景: 邏輯刪除不會真正刪除數據,而是用一個字段標記數據的刪除狀態;實現如下:

  • 在表中添加一個字段deleted標記數據是否被刪除;邏輯刪除時,deleted=1,否則等于0;
  • 查詢時僅查詢deleted=0的數據;

2)相關sql:

  • 邏輯刪除: update table set deleted=1 where deleted=0 and id = #{id}
  • 查詢: select * from table where deleted=0


【3.1】代碼實現

1)MyBatisPlus提供了邏輯刪除,但需要以下配置。

【application.yml】

mybatis-plus:global-config:db-config:logic-delete-field: deleted # 全局邏輯刪除字段名logic-delete-value: 1 # 邏輯已刪除值。可選,默認值為 1logic-not-delete-value: 0 # 邏輯未刪除值。可選,默認值為 0

步驟1:為user_tbl表新增邏輯刪除字段 deleted;

alter table mywarn.user_tbl add column `deleted` varchar(1) default '0' COMMENT '邏輯刪除標記(1-已刪除,0-未刪除)';

【新增字段后的ddl】

CREATE TABLE `user_tbl` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用戶名稱',`mobile_phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '移動電話',`addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '地址',`user_state` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用戶狀態/ON-在線/OFF-離線',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,`last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`balance` decimal(18,2) DEFAULT '0.00' COMMENT '余額',`deleted` varchar(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '邏輯刪除標記(1-已刪除,0-未刪除)',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=123003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用戶表'

步驟2:為UserPO新增字段 deleted,否則邏輯刪除丕生效(非常重要)

@Data
@TableName("user_tbl")
public class UserPO {@TableId("id")private Long id;@TableField("name")private String name;private String mobilePhone;private String addr;private BigDecimal balance;private String userState;private String deleted;
}

步驟3:編寫測試用例

@SpringBootTest
public class MyBatisPlusUserServiceTest {@Autowiredprivate MyBatisPlusUserService userService;@Testvoid testLogicDelete() {Long id = 103L;// 刪除userService.removeById(id);// 查詢UserPO userPO = userService.getById(id);System.out.println(userPO);}
}

【sql執行日志】

==>  Preparing: UPDATE user_tbl SET deleted='1' WHERE id=? AND deleted='0'
==> Parameters: 103(Long)
<==    Updates: 1==>  Preparing: SELECT id,name,mobile_phone,addr,balance,user_state,deleted FROM user_tbl WHERE id=? AND deleted='0'
==> Parameters: 103(Long)
<==      Total: 0


【4】枚舉處理器

官方文檔參見: https://baomidou.com/guides/auto-convert-enum/

1)業務場景:把user_tbl表中的用戶狀態user_state字段在po中用枚舉類表示;

  • 具體的,MyBatisPlus的屬性類型處理器MybatisEnumTypeHandler可以把屬性值轉為枚舉類型,如把varchar轉為enum類型;

【MybatisEnumTypeHandler定義】

public final class MybatisEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {// ...   
}
// 其中 BaseTypeHandler是 ibatis定義的類型處理器基類


【4.1】代碼實現

步驟1:新增用戶狀態枚舉類

【UserStateEnum】

@Getter
@AllArgsConstructor
public enum UserStateEnum {ON("1", "在線"),OFF("0", "離線");@EnumValueprivate final String value;private final String desp;}

步驟2:配置枚舉處理器:

【application.yml】

mybatis-plus:global-config:db-config:logic-delete-field: deleted # 全局邏輯刪除字段名logic-delete-value: 1 # 邏輯已刪除值。可選,默認值為 1logic-not-delete-value: 0 # 邏輯未刪除值。可選,默認值為 0configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler # 基于枚舉常量屬性的處理器

步驟3:修改UserPO,把userState類型從string修改為 UserStateEnum;

@Data
@TableName("user_tbl")
public class UserPO {@TableId("id")private Long id;@TableField("name")private String name;private String mobilePhone;private String addr;private BigDecimal balance;//    private String userState;private UserStateEnum userState;private String deleted;
}

【測試案例】

@SpringBootTest
public class MyBatisPlusUserServiceTest {@Autowiredprivate MyBatisPlusUserService userService;@Testvoid testUserStateEnum() {UserPO userPO = userService.getById(104L);if (userPO.getUserState() == UserStateEnum.ON) {System.out.println("用戶在線");} else {System.out.println("用戶離線");}// 用戶在線}
}


【5】JSON處理器

1)業務場景:user_tbl表有一個info字段是json字符串,在查詢user時,需要把info轉為UserInfo這種Bean;

修改UserPO,為UserInfoPO字段新增注解(表明使用Jackson來做json解析為javabean),且UserPO的@TableName注解新增autoResultMap屬性;

在這里插入圖片描述

【5.1】代碼實現

步驟1:為user_tbl新增info字段,默認值設置為 {“age”:11,“nikeName”:“zhangsan11”}

alter table mywarn.user_tbl add column `info` varchar(512) default '{}' COMMENT '用戶信息';

步驟2:新增UserInfoPO類,修改UserPO,新增UserInfoPO屬性,并為@TableName注解新增屬性autoResultMap=true;

@Data
@TableName(value = "user_tbl", autoResultMap = true)
public class UserPO {@TableId("id")private Long id;@TableField("name")private String name;private String mobilePhone;private String addr;private BigDecimal balance;//    private String userState;private UserStateEnum userState;private String deleted;@TableField(typeHandler = JacksonTypeHandler.class)private UserInfoPO info;
}

【UserInfoPO】

@Data
@NoArgsConstructor
@AllArgsConstructor(staticName = "of") // 設置靜態生成器方法
public class UserInfoPO {private int age;private String nikeName;
}

在這里插入圖片描述

【運行結果】

[{"id": 1,"name": "user1","mobilePhone": "17612342701","addr": "成都錦城三街101號","balance": 1.00,"userState": "ON","userAddrVOList": null,"info": {"age": 11,"nikeName": "zhangsan11"}}
]


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

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

相關文章

初識Neo4j之Cypher(三)

目錄 一、介紹 二、語法 1、節點 2、關系 3、屬性 4、模式 一、介紹 Cypher 是 Neo4j 的聲明式查詢語言&#xff0c;兼容 GQL 標準。通過 openCypher 項目&#xff0c;Cypher 以開源方式提供。它類似于 SQL&#xff0c;但專為圖數據優化。 Cypher 直觀且接近自然語言&…

19-C#靜態方法與靜態類

C#靜態方法與靜態類 1.static-靜態方法animal.eat&#xff08;&#xff09;;//直接調用 public class animal {public static void eat()//定義靜態方法{messagebox.show("animal eat");} }2.static-靜態類animal.eat&#xff08;&#xff09;;//直接調用public stat…

基于YOLO的足球檢測Web應用:從訓練到部署的完整實戰

用Python和深度學習技術打造一個完整的足球檢測系統&#xff0c;支持圖片檢測、視頻分析和實時監控。本文帶你從零開始構建一個專業的Web應用。&#x1f3af; 項目背景 在體育賽事分析和足球訓練中&#xff0c;準確識別和定位足球是一個重要需求。本項目利用YOLO深度學習算法&a…

npm 切換 node 版本 和npm的源

在開發過程中&#xff0c;不同項目可能需要不同版本的 Node.js&#xff0c;同時 于由XX原因&#xff0c;我們需要切換npm的源。這時如果需要切換node版本或者npm的源&#xff0c;我們可以使用以下方法。 使用 nvm 切換 Node 版本 1、安裝 npm install nvm -g2、使用 # 列出所有…

Java學習第二十部分——EasyMock

目錄 一.概述 二.作用 三.工作原理 四.使用示例 五.主要特點 六.適用場景 七.其他模擬框架比較 八.idea簡單項目實戰 1.打開idea創建Java項目&#xff0c;注意構建系統選“Maven” 2.為pom.xml文件添加如下依賴&#xff0c;并重新加載Maven依賴&#xff0c;直至不報錯…

機器學習模型在C++平臺的部署

一、概述機器學習模型的訓練通常在Python環境下完成&#xff0c;而現實生產環境的復雜性和多樣性使得模型的部署成為一個值得關注的重點。不同應用場景下有不同適應的實現方式&#xff0c;這里主要介紹通過一種通用中間格式——ONNX&#xff08;Open Neural Network Exchange&a…

保姆級安裝 Ruby 環境下載及安裝教程, RubyInstaller下載及安裝教程

一、下載安裝 RubyInstaller 1.打開 RubyInstaller 官網&#xff1a;https://rubyinstaller.org/ 點擊跳轉, 官網界面如下圖&#xff1a; 點擊下載最新的 RubyDevkit 版本&#xff08;如 RubyDevkit 3.4.X (x64) &#xff09;。如下圖所示&#xff1a; 注意點&#xff1a;如果…

SQL 一鍵生成 Go Struct!支持字段注釋、類型映射、結構體命名規范

SQL 一鍵生成 Go Struct&#xff01;支持字段注釋、類型映射、結構體命名規范 在 Golang 開發中&#xff0c;尤其是操作數據庫時&#xff0c;我們經常會遇到這種場景&#xff1a; ? 拿到數據庫建表 SQL&#xff0c;卻要手動寫 Go struct? 字段幾十個、類型復雜&#xff0c;…

Web 前端框架選型:React、Vue 和 Angular 的對比與實踐

Web 前端框架選型&#xff1a;React、Vue 和 Angular 的對比與實踐 選擇前端框架就像選擇一個長期合作伙伴。錯誤的選擇可能會讓你的項目在未來幾年內背負沉重的技術債務&#xff0c;而正確的選擇則能讓開發效率飛速提升。 經過多年的項目實踐&#xff0c;我發現很多新人在框架…

C# 值拷貝、引用拷貝、淺拷貝、深拷貝

值拷貝定義&#xff1a;直接復制變量的值&#xff0c;適用于基本數據類型&#xff08;如int, float, char等&#xff09;。在 C# 中&#xff0c;值類型&#xff08;基本數據類型和結構體&#xff09;默認使用值拷貝。特點&#xff1a;創建原始值的完全獨立副本&#xff0c;修改…

深度學習圖像分類數據集—百種鳥類識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;525種鳥類識別分類 訓練數據集總共有84635張圖片&#xff0c;每個文件夾…

零基礎 “入坑” Java--- 八、類和對象(一)

文章目錄一、初識面向對象二、類的定義和使用1.認識類2.類的定義格式三、類的實例化四、this引用五、對象的構造及初始化1.有關初始化2.構造方法3.就地初始化一、初識面向對象 Java是一門純面向對象的語言&#xff08;OOP&#xff09;&#xff0c;在面向對象的世界里&#xff…

數字孿生技術引領UI前端設計新篇章:智能物聯網的深度集成

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生與物聯網的共生革命在智能設備爆發式增長的今天&#xff0c;傳統…

代碼審計-shiro漏洞分析

一、關于shiro介紹 簡單講&#xff0c;shiro是apache旗下的一個Java安全框架&#xff0c;輕量級簡單易上手&#xff0c;框架提供很多功能接口&#xff0c;常見的身份認證 、權限認證、會話管理、Remember 記住功能、加密等等。 二、漏洞分析 1.CVE-2019-12422-shiro550 漏洞原理…

EF提高性能(查詢禁用追蹤)(關閉延遲加載)

EF默認是支持延遲加載的&#xff0c;在加載一個表的數據時&#xff0c;會把關聯表的數據一并加載&#xff0c;這樣會影響性能。 一般建議關閉延遲加載可以提高EF加載的性能。還有其他方法提高性能&#xff08;查詢禁用追蹤&#xff09; 如果要實現延遲加載&#xff0c;必須滿足…

Leetcode+JAVA+貪心III

134.加油站在一條環路上有 n 個加油站&#xff0c;其中第 i 個加油站有汽油 gas[i] 升。你有一輛油箱容量無限的的汽車&#xff0c;從第 i 個加油站開往第 i1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發&#xff0c;開始時油箱為空。給定兩個整數數組 gas 和 …

Qt信號與槽機制及動態調用

Qt信號與槽機制及動態調用一、信號與槽1、Qt信號與槽機制概述2、信號與槽的基本使用3、信號與槽的特性4、使用Lambda表達式作為槽5、信號與槽的參數傳遞6、注意事項二、動態調用機制1、基本用法2、示例代碼3、帶參數的調用4、返回值處理5、信號與槽的動態連接6、動態方法調用7、…

K8s系列之:Kubernetes 的 OLM

K8s系列之:Kubernetes 的 OLM 什么是 Kubernetes 的 OLM什么是Kubernetes中的OperatorOLM 的功能OLM 的核心組件OLM優勢OLM 的工作原理OLM 與 OperatorHub 的關系OLM示例場景什么是CRDoperator 和 CRD的關系為什么需要 CRD 和 OperatorCRD定義資源類型DebeziumServer如何使用d…

前端-HTML-day2

目錄 1、無序列表 2、有序列表 3、定義列表 4、表格-基本使用 5、表格-結構標簽 6、表格-合并單元格 7、表單-input基本使用 8、表單-input占位文本 9、表單-單選框 10、表單-上傳多個文件 11、表單-多選框 12、表單-下拉菜單 13、表單-文本域 14、表單-label標簽…

兩種方式清除已經保存的git賬號密碼

方式一隨便選擇一個文件夾&#xff0c;然后鼠標右鍵-》TortoiseGit ->設置選擇已保存的數據-》認證數據-》清除-》點擊確定方式二 控制面板\用戶帳戶\憑據管理器-》windows憑據普通憑據-》找到git信息-》選擇刪除