MybatisPlus(一)擴展功能

擴展功能

  • 一、靜態工具
  • 二、邏輯刪除
  • 三、通用枚舉
    • 1、定義枚舉
    • 2、配置枚舉處理器
    • 3、測試
  • 四、JSON類型處理器
    • 1、定義實體
    • 2、使用類型處理器
  • 五、分頁
    • 1、配置分頁插件
    • 2、分頁API
    • 3、示例

一、靜態工具

有的時候Service之間也會相互調用,為了避免出現循環依賴問題,MybatisPlus提供一個靜態工具類:Db,其中的一些靜態方法與IService中方法簽名基本一致,也可以幫助我們實現CRUD功能:
在這里插入圖片描述
實例:

@Test
void testDbGet() {User user = Db.getById(1L, User.class);System.out.println(user);
}@Test
void testDbList() {// 利用Db實現復雜條件查詢List<User> list = Db.lambdaQuery(User.class).like(User::getUsername, "o").ge(User::getBalance, 1000).list();list.forEach(System.out::println);
}@Test
void testDbUpdate() {Db.lambdaUpdate(User.class).set(User::getBalance, 2000).eq(User::getUsername, "Rose");
}

傳入實體類的class字節碼,拿到字節碼就能通過反射拿到實體類的相關信息,從而拿到注解上的信息諸如類名、表名等,以此實現CURD。
Db靜態類其實很原始service的方法使用基本一致,只是多了一個實體類的class字節碼。

二、邏輯刪除

對于一些比較重要的數據,我們往往會采用邏輯刪除的方案,即:

  • 在表中添加一個字段標記數據是否被刪除
  • 當刪除數據時把標記置為true
  • 查詢時過濾掉標記為true的數據
    一旦采用了邏輯刪除,所有的查詢和刪除邏輯都要跟著變化,非常麻煩。

為了解決這個問題,MybatisPlus就添加了對邏輯刪除的支持。

只有MybatisPlus生成的SQL語句才支持自動的邏輯刪除,自定義SQL需要自己手動處理邏輯刪除。

例如,我們給address表添加一個邏輯刪除字段:

alter table address add deleted bit default b'0' null comment '邏輯刪除';

然后給Address實體添加deleted字段:
在這里插入圖片描述

接下來,我們要在application.yml中配置邏輯刪除字段:

mybatis-plus:global-config:db-config:logic-delete-field: deleted # 全局邏輯刪除的實體字段名(since 3.3.0,配置后可以忽略不配置步驟2)logic-delete-value: 1 # 邏輯已刪除值(默認為 1)logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)

測試:
首先,我們執行一個刪除操作:

@Test
void testDeleteByLogic() {// 刪除方法與以前沒有區別addressService.removeById(59L);
}

方法與普通刪除一模一樣,但是底層的SQL邏輯變了:
在這里插入圖片描述
查詢一下試試:

@Test
void testQuery() {List<Address> list = addressService.list();list.forEach(System.out::println);
}

會發現id為59的確實沒有查詢出來,而且SQL中也對邏輯刪除字段做了判斷:
在這里插入圖片描述

綜上, 開啟了邏輯刪除功能以后,我們就可以像普通刪除一樣做CRUD,基本不用考慮代碼邏輯問題。還是非常方便的。
注意:
邏輯刪除本身也有自己的問題,比如:

  • 會導致數據庫表垃圾數據越來越多,從而影響查詢效率
  • SQL中全都需要對邏輯刪除字段做判斷,影響查詢效率

因此,我不太推薦采用邏輯刪除功能,如果數據不能刪除,可以采用把數據遷移到其它表的辦法。

三、通用枚舉

User類中有一個用戶狀態字段:
在這里插入圖片描述

像這種字段我們一般會定義一個枚舉,做業務判斷的時候就可以直接基于枚舉做比較。但是我們數據庫采用的是int類型,對應的PO也是Integer。因此業務操作時必須手動把枚舉與Integer轉換,非常麻煩。
因此,MybatisPlus提供了一個處理枚舉的類型轉換器,可以幫我們把枚舉類型與數據庫類型自動轉換。

1、定義枚舉

我們定義一個用戶狀態的枚舉:
在這里插入圖片描述

package com.itheima.mp.enums;import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;@Getter
public enum UserStatus {NORMAL(1, "正常"),FREEZE(2, "凍結");private final int value;private final String desc;UserStatus(int value, String desc) {this.value = value;this.desc = desc;}
}

然后把User類中的status字段改為UserStatus 類型:
在這里插入圖片描述

要讓MybatisPlus處理枚舉與數據庫類型自動轉換,我們必須告訴MybatisPlus,枚舉中的哪個字段的值作為數據庫值。
MybatisPlus提供了@EnumValue 注解來標記枚舉屬性:
在這里插入圖片描述

2、配置枚舉處理器

在application.yaml文件中添加配置:

mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

3、測試

@Test
void testService() {List<User> list = userService.list();list.forEach(System.out::println);
}

在這里插入圖片描述
同時,為了使頁面查詢結果也是枚舉格式,我們需要修改UserVO中的status屬性:

在這里插入圖片描述
并且,在UserStatus枚舉中通過@JsonValue注解標記JSON序列化時展示的字段:

在這里插入圖片描述

最后,在頁面查詢,結果如下:

在這里插入圖片描述

四、JSON類型處理器

數據庫的user表中有一個info字段,是JSON類型:
在這里插入圖片描述

格式像這樣:

{"age": 20, "intro": "佛系青年", "gender": "male"}

而目前User實體類中卻是String類型:
在這里插入圖片描述

這樣一來,我們要讀取info中的屬性時就非常不方便。如果要方便獲取,info的類型最好是一個Map或者實體類。

而一旦我們把info改為對象類型,就需要在寫入數據庫時手動轉為String,再讀取數據庫時,手動轉換為對象,這會非常麻煩。

因此MybatisPlus提供了很多特殊類型字段的類型處理器,解決特殊字段類型與數據庫類型轉換的問題。例如處理JSON就可以使用JacksonTypeHandler處理器。

1、定義實體

我們定義一個單獨實體類來與info字段的屬性匹配:

package com.itheima.mp.domain.po;import lombok.Data;@Data
public class UserInfo {private Integer age;private String intro;private String gender;
}

2、使用類型處理器

接下來,將User類的info字段修改為UserInfo類型,并聲明類型處理器:
在這里插入圖片描述
同時,在User類上添加一個注解,聲明自動映射:

在這里插入圖片描述

測試可以發現,所有數據都正確封裝到UserInfo當中了:

在這里插入圖片描述

五、分頁

在未引入分頁插件的情況下,MybatisPlus是不支持分頁功能的,IService和BaseMapper中的分頁方法都無法正常起效。
所以,我們必須配置分頁插件。

1、配置分頁插件

在項目中新建一個配置類:
在這里插入圖片描述

其代碼如下:

package com.itheima.mp.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {// 初始化核心插件MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加分頁插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

2、分頁API

編寫一個分頁查詢的測試:

@Test
void testPageQuery() {// 1.分頁查詢,new Page()的兩個參數分別是:頁碼、每頁大小Page<User> p = userService.page(new Page<>(2, 2));// 2.總條數System.out.println("total = " + p.getTotal());// 3.總頁數System.out.println("pages = " + p.getPages());// 4.數據List<User> records = p.getRecords();records.forEach(System.out::println);
}

在這里插入圖片描述
這里用到了分頁參數,Page,即可以支持分頁參數,也可以支持排序參數。常見的API如下:

int pageNo = 1, pageSize = 5;
// 分頁參數
Page<User> page = Page.of(pageNo, pageSize);
// 排序參數, 通過OrderItem來指定
page.addOrder(new OrderItem("balance", false));userService.page(page);

3、示例

現在要實現一個用戶分頁查詢的接口,接口規范如下:
在這里插入圖片描述

controller.java

package com.itheima.mp.controller;import com.itheima.mp.domain.dto.PageDTO;
import com.itheima.mp.domain.query.PageQuery;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("users")
@RequiredArgsConstructor
public class UserController {private final UserService userService;@GetMapping("/page")public PageDTO<UserVO> queryUsersPage(UserQuery query){return userService.queryUsersPage(query);}// 。。。 略
}

然后在IUserService中創建queryUsersPage方法:

PageDTO<UserVO> queryUsersPage(PageQuery query);

接下來,在UserServiceImpl中實現該方法:

@Override
public PageDTO<UserVO> queryUsersPage(PageQuery query) {// 1.構建條件// 1.1.分頁條件Page<User> page = Page.of(query.getPageNo(), query.getPageSize());// 1.2.排序條件if (query.getSortBy() != null) {page.addOrder(new OrderItem(query.getSortBy(), query.getIsAsc()));}else{// 默認按照更新時間排序page.addOrder(new OrderItem("update_time", false));}// 2.查詢page(page);// 3.數據非空校驗List<User> records = page.getRecords();if (records == null || records.size() <= 0) {// 無數據,返回空結果return new PageDTO<>(page.getTotal(), page.getPages(), Collections.emptyList());}// 4.有數據,轉換List<UserVO> list = BeanUtil.copyToList(records, UserVO.class);// 5.封裝返回return new PageDTO<UserVO>(page.getTotal(), page.getPages(), list);
}

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

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

相關文章

Redis哨兵模式之Sentinel模式(二)

一、多節點哨兵如何配置&#xff1f; 哨兵配置原理圖 注意&#xff1a;sentinel哨兵模式的搭建是建立在redis主從復制節點配置基礎而搭建&#xff0c;在主從配置中從庫需要配置好replicaof關聯上主庫并關閉安全模式&#xff0c;然后設置好bind端口才能關聯上機器&#xff0c;而…

基于Excel的數據分析思維與分析方法

數據分析一定要會Excel、SQL和Python&#xff1f;非常肯定地回答您&#xff0c;Python、R語言、Excel函數和VBA&#xff0c;以及高級數據分析軟件&#xff0c;都學不到&#xff0c;您將學到&#xff1a;5個有效的數據分析利器&#xff0c;以及分析思維 一、描述性統計分析 在…

計算機網絡筆記(不全)

一、計算機網絡體系結構1.計算機網絡的概念計算機網絡&#xff1a;由若干結點和連接這些結點的鏈路組成。結點可以是計算機、集線器、交換機、路由器等。互連網(internet)&#xff1a;多個計算機網絡通過路由器互相連接而成&#xff0c;可用任意協議通信。互聯網(因特網Interne…

XML Schema 復合元素

XML Schema 復合元素 引言 XML(可擴展標記語言)作為一種靈活的標記語言,廣泛應用于數據交換和存儲。XML Schema 是一種用于描述和定義 XML 文檔結構的語言,它定義了 XML 文檔的元素、屬性、類型和約束。本文將詳細介紹 XML Schema 中的復合元素,并探討其在實際應用中的重…

華為云Flexus+DeepSeek征文 | 彈性算力實戰:Flexus X實例自動擴縮容策略優化

華為云FlexusDeepSeek征文 | 彈性算力實戰&#xff1a;Flexus X實例自動擴縮容策略優化 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者…

【倉頡】運行環境配置VSCode + Win11

作者&#xff1a;大李子 團隊&#xff1a;堅果派 十年iOS&#xff0c;All in轉鴻蒙 前言 “倉頡編程語言是一款面向全場景智能的新一代編程語言&#xff0c;主打原生智能化、天生全場景、高性能、強安全。融入鴻蒙生態&#xff0c;為開發者提供良好的編程體驗。” ——摘自倉…

【K線訓練軟件研發歷程】【日常記錄向】1.K線滑動窗口

文章目錄 當前效果未來發展思路技術選型值得分享的技術點數據加載、解析的代碼echats的代碼當前效果 ??相當于有個hello world了。 未來發展思路 開源 技術選型 界面直接采用electron,等開源后,可以直接掛release,用戶下載安裝包后,一鍵安裝,一鍵運行,降低使用門檻…

抖音解析下載工具 v1.0.0:免安裝單文件,一鍵無水印保存高清視音頻

寶子們&#xff0c;今天給你們帶來一款超輕量的抖音下載神器——抖音解析下載工具 v1.0.0。 它只有單文件&#xff0c;雙擊就能用&#xff0c;免安裝、無廣告、完全免費&#xff0c;復制粘貼鏈接即可一鍵解析下載高清無水印視頻/音頻&#xff0c;簡直不要太方便&#xff01; 為…

Ingress——2

目錄 ?一. 域名重定向&#xff08;HTTP→HTTPS/舊域名跳轉&#xff09;? ?二. 前后端分離Rewrite&#xff08;路徑改寫&#xff09;? ?三. 混合配置示例&#xff08;重定向Rewrite&#xff09;? ?四. SSL/TLS配置&#xff08;HTTPS加密&#xff09;? ?五. 基本認…

12. grafana-Dashboard的Variable(過濾)使用

說明制作這樣一個選擇過濾的下拉框&#xff0c;可以選擇某個服務器的步驟1. 點擊最上面的Dashboard settings2. 選擇Variables 并點擊ADD variable3. 寫出過濾的標簽名和查詢條件&#xff08;label_values(查詢條件)&#xff09;4. 點擊 save as... 保存退出5. 出來后左上角就…

Cursor一鍵續杯pro教程,支持最新1.0系列版本

使用前檢查&#xff1a; 使用前請先看左下角&#xff0c;是否獲取到Cursor的版本號 如果沒有請先在 功能頁面 -→ 自定義Cursor路徑 選擇你Cursor的安裝的路徑&#xff0c;并開啟后重啟YCursor&#xff0c;獲取到版本后才能正常使用功能 檢查軟件左下角的權限標識是否為綠色 如…

pyhton基礎【25】面向對象進階六

目錄 十七.單例模式 實現單例模式的兩種方式 __new__方法概述 單例模式的使用場景 十七.單例模式 引入 單例模式是一種常用的軟件設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來獲取這個實例。 實現單例模式的兩種方式 使用類屬性創…

后端樹形結構

案例 在后端開發中&#xff0c;樹形結構數據的查詢和處理是一個常見的需求&#xff0c;比如部門管理、分類目錄展示等場景。接下來&#xff0c;我們以一個部門管理系統為例&#xff0c;詳細介紹如何實現后端的樹查詢功能。 案例背景 假設我們正在開發一個公司的內部管理系統&am…

高效溝通04-RIDE說服模型

高效溝通專欄–組織運轉的命脈與個人成功的基石 目錄 1. RIDE模型的核心理念2. RIDE模型的應用場景3. RIDE模型使用步驟4. RIDE模型示例與練習4.1 應用RIDE模型:4.2 練習:你來試試!5. 總結RIDE模型是一種結構化的說服框架,旨在幫助你在溝通(尤其是書面溝通或需要清晰邏輯…

利用selenium獲取網頁數據,腳本加載慢問題的解決辦法

問題&#xff1a;最近在寫一個腳本去獲取一個網站的數據&#xff0c;用到一個表格中的數據&#xff0c;條目是1000條&#xff0c;需要逐條去獲取網站上對應的數據&#xff0c;遇到的問題是腳本運行后&#xff0c;很久才開始打開驅動瀏覽器。經過很多次嘗試&#xff0c;主要原因…

Ubuntu查看本機代理的實操指南

快速確認代理狀態的必要性在Ubuntu系統中&#xff0c;代理設置是跨境訪問、企業內網連接、開發調試的重要配置。無論是排查網絡卡頓、驗證代理是否生效&#xff0c;還是確保特定應用走代理通道&#xff0c;快速查看當前代理狀態都是關鍵步驟。圖形界面查看&#xff0c;可視化操…

三格電子——雙通道 CAN(FD)轉以太網

【SG-CAN(FD)NET-210】 一、功能描述 CANFD 完全向下兼容 CAN &#xff0c;以下統稱 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用來把 CANFD 總線數據轉為網口數據的設 備。 網口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四種模式。 可以通過軟件配置…

【一起來學AI大模型】卷積神經網絡(CNN):視覺識別的革命性架構

一、CNN的核心思想與生物啟示 卷積神經網絡&#xff08;Convolutional Neural Networks&#xff09;是受生物視覺皮層啟發的深度學習架構&#xff0c;專門用于處理網格狀拓撲數據&#xff08;如圖像、視頻、音頻&#xff09;。其核心創新在于&#xff1a; 局部感受野&#xff…

創建和編輯Crontab的方法

計劃任務&#xff0c;在 Linux 中一般使用Crontab&#xff0c;通過crontab命令&#xff0c;我們可以在固定的間隔時間執行指定的系統指令或 Shell 腳本。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。這個命令非常適合周期性的日志分析或數據備份等工作。 創建…

在職場中如何培養創新思維?

芯片研發人員&#xff0c;授權發明專利40&#xff0c;聊聊技術層面的創新&#xff0c; 創新的本質&#xff0c;是舊有知識的創造性組合&#xff0c; 不存在無中生有的創新&#xff0c; 你必須建立本領域的知識體系&#xff0c;對過往各種創新&#xff0c;爛熟于心&#xff0…