MyBatis-Plus高級用法:最優化持久層開發

MyBatis-Plus 是 MyBatis 的增強工具,旨在簡化開發、提高效率并保持 MyBatis 的靈活性。本文將詳細介紹 MyBatis-Plus 的高級用法,幫助開發者最優化持久層開發。

一、MyBatis-Plus 簡介

MyBatis-Plus 是一個 ORM 框架,提供了 CRUD 接口、條件構造器、代碼生成器等功能,簡化了常見的持久層開發工作。

核心功能

  • CRUD 接口:簡單的增刪改查操作。
  • 條件構造器:動態生成 SQL 查詢條件。
  • 分頁插件:簡化分頁查詢操作。
  • 邏輯刪除:輕松實現軟刪除功能。
  • 代碼生成器:自動生成實體類、Mapper 接口等代碼。

二、快速入門

1. 添加依賴

pom.xml 中添加 MyBatis-Plus 依賴:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.4</version>
</dependency>
?

2. 配置數據源

application.yml 中配置數據源:

spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
?

3. 創建實體類

創建一個實體類 User

@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;private String email;
}
?

4. 創建 Mapper 接口

創建 Mapper 接口并繼承 BaseMapper

public interface UserMapper extends BaseMapper<User> {
}
?

5. 編寫服務類

編寫服務類使用 UserMapper

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAllUsers() {return userMapper.selectList(null);}
}
?

6. 編寫控制器

編寫控制器調用服務類:

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/list")public List<User> list() {return userService.getAllUsers();}
}
?

三、高級用法

1. 條件構造器

MyBatis-Plus 提供了 QueryWrapperUpdateWrapper 用于動態構造查詢和更新條件。

1.1 QueryWrapper

QueryWrapper 用于構建查詢條件:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John");
List<User> users = userMapper.selectList(queryWrapper);
?
1.2 UpdateWrapper

UpdateWrapper 用于構建更新條件:

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("name", "John").set("age", 30);
userMapper.update(null, updateWrapper);
?

2. 分頁插件

分頁插件簡化了分頁查詢:

@Autowired
private UserMapper userMapper;public IPage<User> getUsersByPage(int pageNum, int pageSize) {Page<User> page = new Page<>(pageNum, pageSize);return userMapper.selectPage(page, null);
}
?

3. 邏輯刪除

邏輯刪除不刪除數據,只是標記為已刪除。首先在實體類中配置邏輯刪除字段:

@TableLogic
private Integer deleted;
?

application.yml 中啟用邏輯刪除:

mybatis-plus:global-config:db-config:logic-delete-value: 1logic-not-delete-value: 0
?

使用時直接調用 deleteById 方法即可:

userMapper.deleteById(1L);
?

4. 代碼生成器

代碼生成器自動生成實體類、Mapper 接口、Service 類和 Controller 類。以下是代碼生成器的簡單示例:

@Data
public class CodeGenerator {public static void main(String[] args) {AutoGenerator autoGenerator = new AutoGenerator();// 數據源配置DataSourceConfig dataSourceConfig = new DataSourceConfig();dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mydb");dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");dataSourceConfig.setUsername("root");dataSourceConfig.setPassword("root");autoGenerator.setDataSource(dataSourceConfig);// 包名配置PackageConfig packageConfig = new PackageConfig();packageConfig.setParent("com.example.demo");autoGenerator.setPackageInfo(packageConfig);// 策略配置StrategyConfig strategyConfig = new StrategyConfig();strategyConfig.setInclude("user"); // 表名strategyConfig.setNaming(NamingStrategy.underline_to_camel);strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);strategyConfig.setEntityLombokModel(true);autoGenerator.setStrategy(strategyConfig);autoGenerator.execute();}
}
?

5. 自定義 SQL 注入器

可以自定義 SQL 注入器,實現個性化需求。例如,添加一個批量插入的方法:

@Component
public class MySqlInjector extends AbstractSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {List<AbstractMethod> methodList = super.getMethodList(mapperClass);methodList.add(new InsertBatchSomeColumn());return methodList;}
}
?

四、最佳實踐

1. 分層架構

建議遵循分層架構,將控制器、服務、數據訪問層分開,提高代碼的可維護性。

2. 統一異常處理

使用 @ControllerAdvice 統一處理異常,提升系統的健壯性。

3. 使用事務管理

在服務層使用 @Transactional 注解管理事務,確保數據一致性:

@Transactional
public void updateUser(User user) {userMapper.updateById(user);
}
?

4. 性能優化

  • 使用批量操作:對于大批量數據操作,使用 MyBatis-Plus 提供的批量操作接口,提高性能。
  • 索引優化:確保數據庫中相關表和字段有適當的索引,提升查詢性能。

五、總結

MyBatis-Plus 通過簡化常見的持久層開發任務,提高了開發效率和代碼的可維護性。通過合理使用條件構造器、分頁插件、邏輯刪除和代碼生成器等高級功能,可以進一步優化持久層開發,提升系統性能和穩定性。

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

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

相關文章

【C++/Linux】TinyWebServer前置知識之IP協議詳解

目錄 IPv4地址 分類 IP數據報分片 IP 協議在傳輸數據報時&#xff0c;將數據報分為若干分片&#xff08;小數據報&#xff09;后進行傳輸&#xff0c;并在目的系統中進行重組&#xff0c;這一過程稱為分片&#xff08;Fragmentation&#xff09;。 IP模塊工作流程?編輯 I…

【辦公類-22-05】20250601Python模擬點擊鼠標上傳CSDN12篇

、 背景需求: 每周為了獲取流量券,每天上傳2篇,獲得1500流量券,每周共上傳12篇,才能獲得3000和500的券。之前我用UIBOT模擬上傳12篇。 【辦公類-22-04】20240418 UIBOT模擬上傳每天兩篇,獲取流量券,并刪除內容_csdn 每日任務流量券-CSDN博客文章瀏覽閱讀863次,點贊18…

由淺入深一文詳解同余原理

由淺入深一文詳解同余原理 一、同余原理的基本概念1.1 同余的定義1.2 剩余類與完全剩余系 二、同余原理的基本性質2.1 自反性2.2 對稱性2.3 傳遞性2.4 加減性2.5 乘性2.6 冪性 三、同余原理的運算與應用3.1 同余運算在計算中的應用3.2 密碼學中的應用3.3 日期與周期問題 四、案…

ArcGIS Pro 創建漁網格網過大,只有幾個格網的解決方案

之前用ArcGIS Pro創建漁網的時候&#xff0c;發現創建出來格網過大&#xff0c;只有幾個格網。 后來查閱資料&#xff0c;發現是坐標不對&#xff0c;導致設置格網大小時單位為度&#xff0c;而不是米&#xff0c;因此需要進行坐標系轉換&#xff0c;網上有很多資料講了ArcGIS …

【MFC】初識MFC

目錄 01 模態和非模態對話框 02 靜態文本 static text 01 模態和非模態對話框 首先我們需要知道模態對話框和非模態對話框的區別&#xff1a; 模態對話框是一種阻塞時對話框&#xff0c;它會阻止用戶與應用程序的其他部分進行交互&#xff0c;直到用戶與該對話框進行交互并關…

【HW系列】—安全設備介紹(開源蜜罐的安裝以及使用指南)

文章目錄 蜜罐1. 什么是蜜罐&#xff1f;2. 開源蜜罐搭建與使用3. HFish 開源蜜罐詳解安裝步驟使用指南關閉方法 總結 蜜罐 1. 什么是蜜罐&#xff1f; 蜜罐&#xff08;Honeypot&#xff09;是一種主動防御技術&#xff0c;通過模擬存在漏洞的系統或服務&#xff08;如數據庫…

TI硬件筆試面試題型解析上

本專欄預計更新60期左右。當前第14期. 這個系列通過在國內外網上搜索大廠公開的筆試和面試題目,然后構造相關的知識點矩陣,讓大家對核心的知識點有更深的認識,這個過程雖然耗時費力,但大廠的很多題目(包括模擬題)確實非常巧妙,很有代表性。由于官方沒有發布過這樣的題庫…

Python打卡訓練營Day43

DAY 43 復習日 作業&#xff1a; kaggle找到一個圖像數據集&#xff0c;用cnn網絡進行訓練并且用grad-cam做可視化 數據集地址&#xff1a;Lung Nodule Malignancy 肺結核良惡性判斷 進階&#xff1a;并拆分成多個文件 import os import pandas as pd import numpy as np from…

悲觀鎖與樂觀鎖:并發編程中的兩種核心控制策略詳解

在并發編程中&#xff0c;悲觀鎖和樂觀鎖是兩種不同的并發控制策略&#xff0c;用于解決多個線程或進程對共享資源的并發訪問問題。下面將詳細介紹它們的概念、實現方式以及優缺點。 悲觀鎖 概念 悲觀鎖認為在并發環境下&#xff0c;多個線程或進程對共享資源的訪問大概率會發…

python 如何寫4或5的表達式

python寫4或5的表達式的方法&#xff1a; python中和是用“and”語句&#xff0c;或是用“or”語句。那么4或5的表達式為“4 or 5” 具體示例如下&#xff1a; 執行結果&#xff1a;

麻省理工新突破:家庭場景下機器人實現精準控制,real-to-sim-to-real學習助力

麻省理工學院電氣工程與計算機科學系Pulkit Agrawal教授&#xff0c;介紹了一種新方法&#xff0c;可以讓機器人在掃描的家庭環境模擬中接受訓練&#xff0c;為任何人都可以實現定制的家庭自動化鋪平了道路。 本文將探討通過Franka機器人在虛擬環境中訓練的特點&#xff0c;研…

Linux程序管理練習題

Linux程序管理100題 一、Linux程序與進程&#xff08;1-15&#xff09; 程序、進程、線程的本質區別是什么&#xff1f; 答案&#xff1a;程序是靜態指令集&#xff0c;進程是運行中的程序實例&#xff0c;線程是進程內的執行單元 進程的并發性和交往性體現在哪些方面&#xf…

虛幻基礎:模型

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 資源模型&#xff1a;骨架/骨骼模型動畫&#xff1a;一系列姿勢補幀&#xff1a;只需設定關鍵姿勢&#xff0c;則系統在關鍵幀姿勢之間自動生成動畫。姿勢的變換&#xff1a;即骨骼的變換 動畫藍圖&#xff1a;執行…

《Discuz! X3.5開發從入門到生態共建》第1章 Discuz! 的前世今生-優雅草卓伊凡

《Discuz! X3.5開發從入門到生態共建》第1章 Discuz! 的前世今生-優雅草卓伊凡 第一節 從康盛創想到騰訊收購&#xff1a;PC時代的輝煌 1.1 Discuz! 的誕生&#xff1a;康盛創想的開源夢想 2001年&#xff0c;中國互聯網正處于萌芽階段&#xff0c;個人網站和論壇開始興起。…

如何打包conda環境從一臺電腦到另外一臺電腦

在 Ubuntu 系統下&#xff0c;使用的是 VSCode 和 Conda 環境開發項目&#xff0c;想要將整個 Conda 環境從一臺電腦遷移到另一臺電腦&#xff0c;可以通過以下步驟來實現打包和導入&#xff1a; ? 一、在原電腦上導出 Conda 環境 1. 激活你要導出的環境 conda activate you…

2025GDCPC廣東省賽游記(附賽時代碼)

我覺得算是給swan的自證之旅畫上一個句號吧...說實話HDU給我帶來的不止是排位上的壓力&#xff0c;更多的是對自己能力的懷疑&#xff0c;特別是pluto不明說但是我很清楚的看不起&#xff08;沒有責備本人的意思&#xff09;&#xff0c;evil和jxj之類的總感覺看到我就是看小丑…

MySQL 修改數據的全鏈路流程

MySQL 修改數據的全鏈路流程&#xff08;InnoDB&#xff09; 全鏈路流程圖關鍵步驟詳解1. 建立連接階段2.SQL解析與優化3. InnoDB內存操作4. 日志記錄過程5. 二階段提交&#xff08;2PC&#xff09; 磁盤同步機制1. Redo Log刷盤策略&#xff08;innodb_flush_log_at_trx_commi…

蘭亭妙微十六年高水準交互設計公司

北京蘭亭妙微&#xff08;藍藍設計&#xff09;成立于 2008 年&#xff08;前身為設計工作室&#xff0c;2011 年正式注冊&#xff09;&#xff0c;由清華團隊主創&#xff0c;專注軟件和互聯網 UI/UE 設計開發 16 年。我們提供從需求調研、界面設計到開發落地的全流程服務&…

【腳本 完全參數化的通用 APT 源配置方案-Debian/Ubuntu】

通過腳本在 Debian/Ubuntu 系統上一鍵切換 APT 源 如Dockerfile中 使用某個源&#xff08;比如 aliyun&#xff09; 假設你的目錄結構是&#xff1a; . ├── Dockerfile └── switch-apt-source.shFROM ubuntu:22.04# 把腳本拷貝到鏡像中 COPY switch-apt-source.sh /us…

學習日記-day20-6.1

完成目標&#xff1a; 知識點&#xff1a; 1.集合_Collections集合工具類 方法:static <T> boolean addAll(Collection<? super T> c, T... elements)->批量添加元素 static void shuffle(List<?> list) ->將集合中的元素順序打亂static <T>…