探索MyBatis-Plus的高階用法

引言

MyBatis-Plus 是 MyBatis 的增強工具包,提供了許多方便快捷的功能來簡化開發,提高效率。除了基本的 CRUD 操作外,MyBatis-Plus 還提供了一些高級功能,本文將探討 MyBatis-Plus 的高階用法,幫助開發者更好地利用該工具包。

1. 動態表名和字段

MyBatis-Plus 支持動態表名和字段,這在一些特殊場景下非常有用,比如多租戶系統或者動態數據源切換。通過注解 @TableName@TableField 可以動態指定表名和字段名。

@TableName("user_${dynamicValue}")
public class User {@TableField(value = "name_${dynamicValue}")private String name;
}

2. 自定義全局操作

MyBatis-Plus 允許自定義全局操作,比如自定義全局的查詢條件、插入前操作、更新前操作等。通過實現 com.baomidou.mybatisplus.core.injector.ISqlInjector 接口可以實現自定義 SQL 注入器,通過實現 com.baomidou.mybatisplus.core.handlers.MetaObjectHandler 接口可以實現字段自動填充等。

@Component
public class CustomMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);}
}

3. 自動分頁

MyBatis-Plus 提供了自動分頁的功能,可以自動根據查詢條件進行分頁,無需手動編寫分頁 SQL。只需在查詢條件中添加分頁參數即可。

Page<User> page = new Page<>(1, 10);
userMapper.selectPage(page, null);

4. 邏輯刪除

MyBatis-Plus 支持邏輯刪除,通過注解 @TableLogic 可以指定邏輯刪除字段,并在查詢時自動過濾掉已被邏輯刪除的記錄。

@Configuration
@MapperScan("com.example.mapper")
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new LogicSqlInjector());interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}@Beanpublic ISqlInjector sqlInjector() {return new LogicSqlInjector();}
}
@TableLogic
@TableField(value = "is_deleted")
private Integer deleted;
// 執行邏輯刪除
userMapper.deleteById(userId);// 查詢用戶列表,自動過濾已被邏輯刪除的記錄
List<User> userList = userMapper.selectList(null);

5. 實現多租戶系統

在多租戶系統中,不同的租戶需要訪問不同的數據,但數據結構相同。通過動態表名可以很方便地實現多租戶數據的隔離存儲。

@TableName("user_${tenantId}")
public class User {@TableField(value = "name")private String name;
}

根據不同的租戶(tenantId),用戶數據將存儲在不同的表中,實現了多租戶數據的隔離存儲。?

?

6. 動態數據源切換

在一些特殊的場景中,需要根據不同的條件切換數據源。通過動態表名和字段可以很方便地實現動態數據源切換。

@TableName("user_${dataSource}")
public class User {@TableField(value = "name_${dynamicValue}")private String name;
}

7. 數據權限控制

在一些需要進行數據權限控制的系統中,不同的用戶可能只能訪問部分數據。通過動態表名和字段可以很方便地實現數據權限控制。

@TableName("user_${roleId}")
public class User {@TableField(value = "name_${dynamicValue}")private String name;
}

根據不同的用戶角色(roleId),用戶數據將存儲在不同的表中,并且字段名也會動態變化,實現數據權限控制的需求。?

?

8. 分表分庫

在數據量較大的系統中,為了提高性能和擴展性,可能會采用分表分庫的方式來存儲數據。通過動態表名和字段可以很方便地實現分表分庫。

@TableName("user_${shardingValue}")
public class User {@TableId(type = IdType.AUTO)private Long id;private String username;private Integer age;// 其他字段...
}

?分庫分表策略配置

@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 配置分頁插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 配置分片插件interceptor.addInnerInterceptor(new DynamicTableNameInnerInterceptor());return interceptor;}@Beanpublic DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {return new DynamicTableNameInnerInterceptor();}
}

分庫分表策略實現?

public class DynamicTableNameInnerInterceptor extends InnerInterceptor {@Overridepublic void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {if (parameter instanceof Map) {Map<?, ?> paramMap = (Map<?, ?>) parameter;ShardingValue shardingValue = (ShardingValue) paramMap.get("shardingValue");if (shardingValue != null) {String tableName = "user_" + shardingValue.getValue() % 2; // 根據分片值計算表名String sql = boundSql.getSql().replaceFirst("user", tableName); // 替換原始 SQL 中的表名ReflectionUtils.setField(boundSql, "sql", sql); // 修改 BoundSql 中的 SQL}}}
}

9. 動態 SQL

在一些復雜的業務場景中,可能需要根據不同的條件動態生成 SQL,比如動態拼接 WHERE 子句、動態排序等。MyBatis-Plus 提供了方便的 API 來實現動態 SQL。

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", status);
if (StringUtils.isNotBlank(keyword)) {wrapper.like("name", keyword);
}
wrapper.orderByDesc("create_time");
List<User> userList = userMapper.selectList(wrapper);

10. 樂觀鎖

在并發場景下,為了保證數據的一致性,可能會使用樂觀鎖機制來控制并發訪問。MyBatis-Plus 提供了樂觀鎖的支持,通過 @Version 注解標注實體類中的版本字段即可實現樂觀鎖功能。

@Version
@TableField(value = "version")
private Integer version;

11. 邏輯分頁

在一些特殊的場景中,可能需要進行復雜的分頁操作,比如根據某個字段的范圍進行分頁查詢。MyBatis-Plus 提供了邏輯分頁的功能,通過 last() 方法可以實現自定義的分頁邏輯。根據年齡大于等于 18 并按照創建時間降序排列的條件進行分頁查詢

IPage<User> page = new Page<>(1, 10);
userMapper.selectPage(page, Wrappers.<User>lambdaQuery().ge(User::getAge, 18).orderByDesc(User::getCreateTime).last("limit 10"));

12. 代碼生成器????????

public class CodeGenerator {public static void main(String[] args) {AutoGenerator generator = new AutoGenerator();// 配置數據源、包配置、策略配置等generator.execute();}
}

結語

MyBatis-Plus 是一個非常優秀的 MyBatis 增強工具包,它在簡化開發、提高效率、提升性能等方面都有著顯著的優勢,是開發中不可或缺的利器。希望本文對讀者對 MyBatis-Plus 的了解有所幫助,歡迎大家深入學習和使用 MyBatis-Plus。

?

更多文章


??Spring中的事務是如何實現的-CSDN博客

ZooKeeper 使用介紹和原理詳解-CSDN博客

Redis集群選舉流程詳解-CSDN博客

Hadoop技術解析:分布式存儲與計算-CSDN博客

ES底層原理深度剖析_es 的底層原理-CSDN博客

?

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

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

相關文章

Linux服務器搭建超簡易跳板機連接阿里云服務器

簡介 想要規范內部連接阿里云云服務器的方式&#xff0c;但是最近懶病犯了&#xff0c;先搞一個簡易式的跳板機過渡一下&#xff0c;順便在出一個教程&#xff0c;其他以后再說&#xff01; 配置方法 創建密鑰 登錄阿里云&#xff0c;找到云服務器ECS控制臺&#xff0c;點擊…

【小白友好】LeetCode 打家劫舍 III

https://leetcode.cn/problems/house-robber-iii/description/ 前言 建議還是先看看動態規劃的基礎題再看這個。動態規劃是不刷題&#xff0c;自己100%想不出來的。 基礎題&#xff1a; 23 小白想法 現在我們想遍歷的數據結構不是數組了&#xff0c;而是一顆樹。在樹上的d…

C++遞推

統計每個月兔子的總數 #include<bits/stdc.h> using namespace std; int n,sum0; void f(int); int main() {int a[1000];cin>>n;a[1]1;a[2]2;for(int i3;i<1000;i){a[i]a[i-1]a[i-2];}cout<<a[n];return 0; } void f(int n){}猴子吃桃子 #include<b…

2024年華為OD機試真題-電腦病毒感染-Python-OD統一考試(C卷)

題目描述: 一個局域網內有很多臺電腦,分別標注為0 - N-1的數字。相連接的電腦距離不一樣,所以感染時間不一樣,感染時間用t表示。 其中網絡內一個電腦被病毒感染,其感染網絡內所有的電腦需要最少需要多長時間。如果最后有電腦不會感染,則返回-1 給定一個數組times表示一個…

在Spring Boot中如何實現異常處理?

在Spring Boot中&#xff0c;異常處理可以通過幾種方式實現&#xff0c;以提高應用程序的健壯性和用戶體驗。這些方法包括使用ControllerAdvice注解、ExceptionHandler注解、實現ErrorController接口等。下面是一些實現Spring Boot異常處理的常用方法&#xff1a; 1. 使用Cont…

Git實戰(2)

git work flow ------------------------------------------------------- ---------------------------------------------------------------- 場景問題及處理 問題1&#xff1a;最近提交了 a,b,c,d記錄&#xff0c;想把b記錄刪掉其他提交記錄保留&#xff1a; git reset …

【C++ 編程指南】

C 編程指南 ■ C環境安裝■ C 基本語法■ 預定義宏■ # 和 ## 運算符■ C 引用■ C 命名空間■ 定義命名空間■ using 指令■ 嵌套的命名空間 ■ String類■ 類■ 類的static靜態成員 ■ C 繼承■ 繼承類型 public、protected 或 private■ 訪問控制和繼承■ 多繼承■ 數據抽象…

機器學習-面經

經歷了2023年的秋招&#xff0c;現在也已經入職半年了&#xff0c;空閑時間將面試中可能遇到的機器學習問題整理了一下&#xff0c;可能答案也會有錯誤的&#xff0c;希望大家能指出&#xff01;另外&#xff0c;不論是實習&#xff0c;還是校招&#xff0c;都祝福大家能夠拿到…

990-28產品經理:Different types of IT risk 不同類型的IT風險

Your IT systems and the information that you hold on them face a wide range of risks. If your business relies on technology for key operations and activities, you need to be aware of the range and nature of those threats. 您的IT系統和您在其中持有的信息面臨…

數據結構c版(2)——二叉樹

本章我們來了解一下二叉樹這一概念。 目錄 1.樹概念及結構 1.1樹的概念??????? 1.2 樹的特點&#xff1a; 1.3 樹的相關概念 1.4 樹的表示??????? 1.5 樹在實際中的運用&#xff08;表示文件系統的目錄樹結構&#xff09; 2.二叉樹概念及結構 2.1概念 …

Qt 簡約美觀的動畫 擺鐘風格 第十季

&#x1f60a; 今天給大家分享一個擺鐘風格的加載動畫 &#x1f60a; 效果如下: 最近工作忙起來了 , 后續再分享其他有趣的加載動畫吧. 一共三個文件 , 可以直接編譯運行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <Q…

【C++】用文件流的put和get成員函數讀寫文件

題目 編寫一個mycopy程序&#xff0c;實現文件復制的功能。用法是在控制臺輸入&#xff1a; mycooy 源文件名 目標文件名 參數介紹 m a i n main main 函數的參數有兩個&#xff0c;一個int類型參數和一個指針數組。 a r g c argc argc 表示參數的個數。參數為void時 a r g …

機器人 標準DH與改進DH

文章目錄 1 建立機器人坐標系1.1 連桿編號1.2 關節編號1.3 坐標系方向2 標準DH(STD)2.1 確定X軸方向2.2 建模步驟2.3 變換順序2.4 變換矩陣3 改進DH(MDH)3.1 確定X軸方向3.2 建模步驟3.3 變換順序3.4 變換矩陣4 標準DH與改進DH區別5 Matlab示例參考鏈接1 建立機器人坐標系 1.1…

Elasticsearch:如何創建搜索引擎

作者&#xff1a;Jessica Taylor 搜索引擎是生活中我們認為理所當然的事情之一。 每當我們尋找某些東西時&#xff0c;我們都會將一個單詞或短語放入搜索引擎&#xff0c;就像魔術一樣&#xff0c;它會為我們提供一個匹配結果列表。 現在可能感覺不那么神奇了&#xff0c;因為這…

Go-知識struct

Go-知識struct 1. struct 的定義1.1 定義字段1.2 定義方法 2. struct的復用3. 方法受體4. 字段標簽4.1 Tag是Struct的一部分4.2 Tag 的約定4.3 Tag 的獲取 githupio地址&#xff1a;https://a18792721831.github.io/ 1. struct 的定義 Go 語言的struct與Java中的class類似&am…

第二十三章 :Docker 部署 Redis

第二十三章 :Docker Redis 部署 Docker version 25.0.3, build 4debf41 ,Docker Compose version v2.24.2Redis-6.0.6 鏡像 redis:6.0.6-alpineRedis-6.0.6版本 部署規劃 服務器IP192.168.92.105端口6379安裝目錄/home/work/docker-redis-6.0.6數據映射目錄/home/work/do…

最簡單的基于 FFmpeg 的收流器(以接收 RTMP 為例)

最簡單的基于 FFmpeg 的收流器&#xff08;以接收 RTMP 為例&#xff09; 最簡單的基于 FFmpeg 的收流器&#xff08;以接收 RTMP 為例&#xff09;正文結果工程文件下載參考鏈接 最簡單的基于 FFmpeg 的收流器&#xff08;以接收 RTMP 為例&#xff09; 參考雷霄驊博士的文章…

藍凌OA frpt_listreport_definefield.aspx接口存在SQL注入漏洞

免責聲明&#xff1a;文章來源互聯網收集整理&#xff0c;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失&#xff0c;均由使用者本人負責&#xff0c;所產生的一切不良后果與文章作者無關。該…

DevStack 部署 OpenStack

Devstack 簡介 DevStack 是一系列可擴展的腳本&#xff0c;用于基于 git master 的最新版本快速調出完整的 OpenStack 環境。devstack 以交互方式用作開發環境和 OpenStack 項目大部分功能測試的基礎。 devstack 透過執行 stack.sh 腳本&#xff0c;搭建 openstack 環境&…

lv20 QT主窗口4

熟悉創建主窗口項目 1 QAction 2 主窗口 菜單欄&#xff1a;fileMenu menuBar()->addMenu(tr("&File")); 工具欄&#xff1a;fileToolBar addToolBar(tr("File")); 浮動窗&#xff1a;QDockWidget *dockWidget new QDockWidget(tr("Dock W…