SpringCloud持久層框架MyBatis Plus的使用與原理解析
在現(xiàn)代微服務(wù)架構(gòu)中,SpringCloud 是一個(gè)非常流行的解決方案。而在數(shù)據(jù)庫(kù)操作層面,MyBatis Plus 作為 MyBatis 的增強(qiáng)工具,能夠簡(jiǎn)化開(kāi)發(fā),提升效率,特別是在開(kāi)發(fā)企業(yè)級(jí)應(yīng)用和分布式系統(tǒng)時(shí)尤為有用。本文將詳細(xì)介紹 MyBatis Plus 的使用方法、原理及其與 MyBatis 的區(qū)別。
一、MyBatis Plus 簡(jiǎn)介
1. MyBatis 簡(jiǎn)介
MyBatis 是一個(gè)優(yōu)秀的 ORM 框架,它通過(guò) XML 或注解的方式將 Java 方法與 SQL 語(yǔ)句進(jìn)行映射,并且可以靈活地控制 SQL 執(zhí)行的各個(gè)細(xì)節(jié),提供極高的自由度。它廣泛應(yīng)用于項(xiàng)目中,尤其是在對(duì) SQL 語(yǔ)句要求比較嚴(yán)格的場(chǎng)景中。
2. MyBatis Plus 介紹
MyBatis Plus 是在 MyBatis 的基礎(chǔ)上進(jìn)行增強(qiáng)的持久層框架,專注于簡(jiǎn)化 MyBatis 的開(kāi)發(fā)工作。它封裝了常用的 CRUD 操作,極大地減少了開(kāi)發(fā)者編寫 SQL 的工作量。其目標(biāo)是“更少的配置,更多的功能”,通過(guò)插件機(jī)制提供更強(qiáng)大的功能擴(kuò)展。
3. MyBatis 與 MyBatis Plus 的對(duì)比
| 對(duì)比項(xiàng) | MyBatis | MyBatis Plus |
|---|---|---|
| 核心理念 | 手寫 SQL,靈活但需要大量的 SQL 代碼 | 自動(dòng)化 CRUD,大大減少手寫 SQL |
| SQL 編寫 | 需要手動(dòng)編寫所有 SQL 語(yǔ)句 | 提供默認(rèn) CRUD 接口,只需少量自定義 SQL |
| 復(fù)雜查詢 | 需要手動(dòng)編寫復(fù)雜 SQL 語(yǔ)句 | 提供條件構(gòu)造器,簡(jiǎn)化復(fù)雜查詢操作 |
| 分頁(yè) | 需要手動(dòng)編寫分頁(yè)邏輯 | 內(nèi)置分頁(yè)插件,簡(jiǎn)化分頁(yè)操作 |
| 性能優(yōu)化 | 自定義 SQL 性能優(yōu)化較靈活 | 提供多種插件支持性能優(yōu)化,如 SQL 執(zhí)行分析插件 |
| 代碼生成 | 不支持代碼生成 | 提供自動(dòng)代碼生成器,支持一鍵生成 Mapper、Service 等 |
| 擴(kuò)展能力 | 通過(guò)配置擴(kuò)展 | 內(nèi)置多種插件機(jī)制,支持?jǐn)U展,如樂(lè)觀鎖、審計(jì)等 |
通過(guò)這張對(duì)比表可以看出,MyBatis Plus 在開(kāi)發(fā)效率和功能擴(kuò)展上具有顯著優(yōu)勢(shì),尤其在企業(yè)級(jí)開(kāi)發(fā)中,可以大大簡(jiǎn)化數(shù)據(jù)庫(kù)操作的工作。
二、MyBatis Plus 的基本使用
1. 基礎(chǔ)依賴和配置
要在 SpringCloud 中使用 MyBatis Plus,首先需要在項(xiàng)目的 pom.xml 中添加 MyBatis Plus 的依賴:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency>接下來(lái),在 application.yml 中配置數(shù)據(jù)庫(kù)連接:
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database?useSSL=false
username: root
password: your_password
mybatis-plus:
mapper-locations: classpath:/mapper/*.xml2. 實(shí)體類的定義
在 MyBatis Plus 中,實(shí)體類是映射數(shù)據(jù)庫(kù)表的核心。在實(shí)體類中,常用 @TableName 和 @TableId 注解來(lái)映射表和主鍵。
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}3. Mapper 接口的編寫
Mapper 接口是 MyBatis Plus 提供的基礎(chǔ) CRUD 接口,繼承 BaseMapper 就可以擁有常用的 CRUD 功能,無(wú)需額外編寫 SQL。
public interface UserMapper extends BaseMapper<User> {
}4. Service 層的實(shí)現(xiàn)
為了更好地管理業(yè)務(wù)邏輯,通常會(huì)在 Service 層中編寫業(yè)務(wù)方法??梢酝ㄟ^(guò)注入 Mapper 來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getAllUsers() {
return userMapper.selectList(null);
}
public void createUser(User user) {
userMapper.insert(user);
}
}三、MyBatis Plus 的高級(jí)用法
1. 分頁(yè)插件
分頁(yè)是大多數(shù)系統(tǒng)必備的功能。MyBatis Plus 內(nèi)置分頁(yè)插件,可以通過(guò)簡(jiǎn)單的配置實(shí)現(xiàn)高效分頁(yè)。
@Autowired
private UserMapper userMapper;
public IPage<User> getUsersPage(int pageNum, int pageSize) {
Page<User> page = new Page<>(pageNum, pageSize);
return userMapper.selectPage(page, null);
}2. 樂(lè)觀鎖插件
MyBatis Plus 支持樂(lè)觀鎖,防止多個(gè)用戶同時(shí)修改同一條數(shù)據(jù)時(shí)的并發(fā)問(wèn)題??梢酝ㄟ^(guò)在實(shí)體類上添加 @Version 注解來(lái)啟用樂(lè)觀鎖功能。
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@Version
private Integer version; // 樂(lè)觀鎖版本字段
}3. 多租戶插件
MyBatis Plus 提供了多租戶插件,支持在多租戶架構(gòu)中為每個(gè)租戶分配獨(dú)立的數(shù)據(jù)空間,避免數(shù)據(jù)泄露或沖突。
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 多租戶插件配置
TenantLineInnerInterceptor tenantLineInnerInterceptor = new TenantLineInnerInterceptor();
interceptor.addInnerInterceptor(tenantLineInnerInterceptor);
return interceptor;
}
}4. 自動(dòng)填充功能
MyBatis Plus 支持自動(dòng)填充常見(jiàn)字段,如創(chuàng)建時(shí)間、更新時(shí)間等??梢酝ㄟ^(guò) @TableField 注解配置字段的自動(dòng)填充策略。
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime; // 自動(dòng)填充創(chuàng)建時(shí)間
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; // 自動(dòng)填充更新時(shí)間
}5. 邏輯刪除功能
邏輯刪除是一種不物理刪除數(shù)據(jù),而是通過(guò)標(biāo)記刪除狀態(tài)的方式實(shí)現(xiàn)刪除。MyBatis Plus 提供了邏輯刪除支持,可以通過(guò) @TableLogic 注解實(shí)現(xiàn)。
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableLogic
private Integer deleted; // 邏輯刪除字段
}四、MyBatis Plus 原理詳解
MyBatis Plus 的原理是基于 MyBatis 的核心功能進(jìn)行增強(qiáng),主要通過(guò) 插件機(jī)制 和 代碼生成機(jī)制 提供額外的功能支持。
1. 基于 MyBatis 核心的增強(qiáng)
MyBatis Plus 是對(duì) MyBatis 的擴(kuò)展和增強(qiáng),在 MyBatis 的基礎(chǔ)上引入了大量的插件和自定義功能。例如,通過(guò)擴(kuò)展 BaseMapper,MyBatis Plus 為所有實(shí)體類提供了基礎(chǔ)的 CRUD 功能,開(kāi)發(fā)者無(wú)需編寫重復(fù)的 SQL。
2. 插件機(jī)制
MyBatis Plus 的插件機(jī)制非常靈活,允許開(kāi)發(fā)者自定義插件,擴(kuò)展 MyBatis Plus 的功能。MyBatis Plus 通過(guò) 責(zé)任鏈模式 處理多個(gè)插件請(qǐng)求,插件之間通過(guò) 鏈?zhǔn)秸{(diào)用 實(shí)現(xiàn)功能的擴(kuò)展。
常見(jiàn)的插件包括:
- 分頁(yè)插件:通過(guò)在 SQL 執(zhí)行前后進(jìn)行攔截,實(shí)現(xiàn)分頁(yè)功能。
- 多租戶插件:通過(guò)在 SQL 中自動(dòng)加入租戶 ID 實(shí)現(xiàn)數(shù)據(jù)隔離。
- 樂(lè)觀鎖插件:通過(guò)在 SQL 中自動(dòng)加入版本號(hào)實(shí)現(xiàn)并發(fā)控制。
3. 條件構(gòu)造器
MyBatis Plus 提供了 條件構(gòu)造器,簡(jiǎn)化了復(fù)雜 SQL 的拼裝過(guò)程。條件構(gòu)造器基于 Lambda 表達(dá)式,能夠靈活構(gòu)建動(dòng)態(tài)查詢條件,極大地簡(jiǎn)化了 SQL 的編寫工作。
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(User::getName, "Tom").ge(User::getAge, 18 ); List<User> users = userMapper.selectList(queryWrapper);
4. 自動(dòng)代碼生成器
MyBatis Plus 提供了自動(dòng)代碼生成器,支持通過(guò)數(shù)據(jù)庫(kù)表結(jié)構(gòu)自動(dòng)生成實(shí)體類、Mapper、Service、Controller 等層的代碼,大幅減少手工編寫代碼的工作量。這一特性非常適合大型項(xiàng)目和快速迭代開(kāi)發(fā)的場(chǎng)景。
5. 動(dòng)態(tài) SQL 解析
MyBatis Plus 支持動(dòng)態(tài) SQL 解析,通過(guò)注解或 XML 方式在運(yùn)行時(shí)解析 SQL,生成最終的 SQL 語(yǔ)句。這種方式使得 SQL 編寫更加靈活,能夠適應(yīng)復(fù)雜的業(yè)務(wù)邏輯。
五、MyBatis Plus 的使用總結(jié)
MyBatis Plus 在簡(jiǎn)化 MyBatis 開(kāi)發(fā)工作、提升開(kāi)發(fā)效率和靈活性方面表現(xiàn)出色。它不僅保留了 MyBatis 的強(qiáng)大 SQL 自定義功能,還通過(guò)插件機(jī)制和自動(dòng)化工具提供了更多的擴(kuò)展功能。
MyBatis Plus 的核心優(yōu)勢(shì):
| 優(yōu)勢(shì) | 說(shuō)明 |
|---|---|
| 自動(dòng)化 CRUD | 通過(guò)內(nèi)置的 CRUD 接口,減少了開(kāi)發(fā)者手動(dòng)編寫 SQL 的工作量。 |
| 分頁(yè)和多租戶支持 | MyBatis Plus 內(nèi)置分頁(yè)和多租戶插件,能夠輕松處理復(fù)雜的查詢場(chǎng)景。 |
| 性能優(yōu)化 | 通過(guò)插件機(jī)制和緩存機(jī)制,MyBatis Plus 提供多種性能優(yōu)化手段,保證高效的數(shù)據(jù)庫(kù)操作。 |
| 代碼生成器 | 自動(dòng)生成常用代碼,提升開(kāi)發(fā)效率,加快項(xiàng)目開(kāi)發(fā)速度。 |
總之,MyBatis Plus 是 SpringCloud 項(xiàng)目中非常優(yōu)秀的持久層框架。通過(guò)其豐富的功能和靈活的擴(kuò)展機(jī)制,可以大幅提升開(kāi)發(fā)效率,特別適用于大規(guī)模分布式系統(tǒng)的開(kāi)發(fā)。
到此這篇關(guān)于SpringCloud持久層框架MyBatis Plus的使用與原理詳解的文章就介紹到這了,更多相關(guān)SpringCloud MyBatis Plus使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java核心編程之文件隨機(jī)讀寫類RandomAccessFile詳解
這篇文章主要為大家詳細(xì)介紹了Java核心編程之文件隨機(jī)讀寫類RandomAccessFile,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
淺談collection標(biāo)簽的oftype屬性能否為java.util.Map
這篇文章主要介紹了collection標(biāo)簽的oftype屬性能否為java.util.Map,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
微信公眾帳號(hào)開(kāi)發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例
本篇文章主要介紹了微信公眾帳號(hào)開(kāi)發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12
Spring boot如何配置請(qǐng)求的入?yún)⒑统鰠son數(shù)據(jù)格式
這篇文章主要介紹了spring boot如何配置請(qǐng)求的入?yún)⒑统鰠son數(shù)據(jù)格式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Spring Boot部署到Tomcat過(guò)程中遇到的問(wèn)題匯總
這篇文章主要給大家分享了關(guān)于Spring Boot部署到Tomcat過(guò)程中遇到的一些問(wèn)題,文中將解決的方法介紹非常詳細(xì),對(duì)同樣遇到這個(gè)問(wèn)題的朋友具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
org.slf4j.Logger中info()方法的使用詳解
這篇文章主要介紹了org.slf4j.Logger中info()方法的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Intellij Idea插件開(kāi)發(fā)之創(chuàng)建項(xiàng)目層級(jí)的右鍵菜單
這篇文章主要介紹了Intellij Idea插件開(kāi)發(fā)之創(chuàng)建項(xiàng)目層級(jí)的右鍵菜單,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
SpringBoot實(shí)現(xiàn)excel生成并且通過(guò)郵件發(fā)送的步驟詳解
實(shí)際開(kāi)發(fā)中,特別是在B端產(chǎn)品的開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到導(dǎo)出excel的功能,更進(jìn)階一點(diǎn)的需要我們定期生成統(tǒng)計(jì)報(bào)表,然后通過(guò)郵箱發(fā)送給指定的人員,?今天要帶大家來(lái)實(shí)現(xiàn)的就是excel生成并通過(guò)郵件發(fā)送,需要的朋友可以參考下2023-10-10

