MyBatis-Plus 與 Spring Boot 集成原理實(shí)戰(zhàn)示例
下面是對(duì) MyBatis-Plus 與 Spring Boot 集成原理的源碼級(jí)深度分析,涵蓋自動(dòng)配置、核心組件、啟動(dòng)流程、關(guān)鍵類(lèi)解析以及與原生 MyBatis 的差異。通過(guò)本篇分析,你將徹底理解 MyBatis-Plus 是如何在 Spring Boot 環(huán)境中實(shí)現(xiàn)“開(kāi)箱即用”的。
?? 一、MyBatis-Plus 簡(jiǎn)介
MyBatis-Plus(簡(jiǎn)稱(chēng) MP) 是基于 MyBatis 的增強(qiáng)工具,完全兼容 MyBatis,提供了:
- 無(wú)需寫(xiě) SQL 的 CRUD 操作(
IService/BaseMapper) - 自動(dòng)分頁(yè)插件
- 邏輯刪除
- 自動(dòng)填充字段(如
create_time) - 代碼生成器
- 性能分析插件
它并不是替代 MyBatis,而是對(duì) MyBatis 的“增強(qiáng) + 自動(dòng)化”。
?? 二、集成方式(Spring Boot)
1. 引入依賴(lài)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>?? 注意:使用 mybatis-plus-boot-starter 而非 mybatis-plus,它會(huì)自動(dòng)引入 mybatis-spring 并觸發(fā)自動(dòng)配置。
?? 三、核心機(jī)制:自動(dòng)配置(Auto Configuration)
1. 自動(dòng)配置入口
Spring Boot 啟動(dòng)時(shí),會(huì)加載:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
內(nèi)容包含:
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
? 這是 MP 的自動(dòng)配置類(lèi),由 Spring Boot 2.4+ 的新機(jī)制加載。
2.MybatisPlusAutoConfiguration核心功能
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisPlusProperties.class)
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisPlusAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// 設(shè)置 MyBatis-Plus 全局配置、插件、掃描路徑等
return factoryBean.getObject();
}
@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean
@ConditionalOnProperty(prefix = "mybatis-plus", name = "mapper-locations")
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setBasePackage(mybatisPlusProperties.getMapperLocations());
return configurer;
}
}?? 本質(zhì):在原生 MyBatis 集成 Spring 的基礎(chǔ)上,做了增強(qiáng)和默認(rèn)配置。
??? 四、MyBatis-Plus 核心增強(qiáng)組件
1.MybatisSqlSessionFactoryBean—— 增強(qiáng)版工廠
繼承自 SqlSessionFactoryBean,但做了以下增強(qiáng):
| 功能 | 說(shuō)明 |
|---|---|
| 自動(dòng)注入全局配置 | 如 GlobalConfig(ID 生成策略、邏輯刪除等) |
| 自動(dòng)注冊(cè)核心插件 | 如 PaginationInnerInterceptor(分頁(yè))、LogicDeleteInnerInterceptor(邏輯刪除) |
支持 @DS 多數(shù)據(jù)源 | 集成 dynamic-datasource-spring-boot-starter |
// 自動(dòng)添加分頁(yè)插件
if (globalConfig.getDbConfig().isEnableSqlRunner()) {
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
}
2.BaseMapper<T>—— 通用 Mapper 接口
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
T selectById(Serializable id);
int updateById(T entity);
int deleteById(Serializable id);
// ... 更多方法
}
- 繼承自 MyBatis 的
Mapper<T>,但提供了默認(rèn) SQL 實(shí)現(xiàn)(通過(guò) MP 內(nèi)部 SQL 構(gòu)造器自動(dòng)生成)。 - 無(wú)需 XML 或
@Select注解,即可使用 CRUD。
?? 原理:MP 在啟動(dòng)時(shí),通過(guò)
MapperRegistry掃描所有繼承BaseMapper的接口,并為其生成 SQL。
3.IService<T>與ServiceImpl<M,T>—— 服務(wù)層增強(qiáng)
public interface UserService extends IService<User> {}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}ServiceImpl<M,T>內(nèi)部持有baseMapper,調(diào)用BaseMapper方法。- 提供
saveBatch()、list()、page()等批量操作。
4.MybatisPlusInterceptor—— 核心插件鏈
MP 將多個(gè)功能封裝為 Inner Interceptor,統(tǒng)一注冊(cè)到 MybatisPlusInterceptor:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
interceptor.addInnerInterceptor(new LogicDeleteInnerInterceptor());
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); // 防止全表更新/刪除
return interceptor;
}| 插件 | 作用 |
|---|---|
PaginationInnerInterceptor | 分頁(yè)支持(替換 PageHelper) |
LogicDeleteInnerInterceptor | 邏輯刪除(自動(dòng)改寫(xiě) SQL:WHERE deleted=0) |
BlockAttackInnerInterceptor | 阻止無(wú) WHERE 條件的 UPDATE/DELETE |
TenantLineInnerInterceptor | 多租戶支持 |
?? 所有插件基于 MyBatis 的
Executor攔截機(jī)制實(shí)現(xiàn)。
?? 五、啟動(dòng)流程源碼剖析
flowchart TD
A[Spring Boot 啟動(dòng)] --> B[加載 MybatisPlusAutoConfiguration]
B --> C[創(chuàng)建 SqlSessionFactory]
C --> D[MybatisSqlSessionFactoryBean.build()]
D --> E[解析 Mapper 接口]
E --> F[MP 掃描 BaseMapper 子接口]
F --> G[生成默認(rèn) SQL(通過(guò) SqlMethod 枚舉)]
G --> H[注冊(cè) MappedStatement]
H --> I[注入 MybatisPlusInterceptor]
I --> J[Mapper 代理對(duì)象創(chuàng)建]
J --> K[Service 層注入 Mapper]
K --> L[應(yīng)用就緒]
關(guān)鍵源碼入口:
| 類(lèi) | 作用 |
|---|---|
MybatisPlusAutoConfiguration | 自動(dòng)配置主類(lèi) |
MybatisSqlSessionFactoryBean | 構(gòu)建 SqlSessionFactory,注入 MP 特性 |
DefaultSqlSession | 執(zhí)行 SQL,MP 的 SQL 已注冊(cè)為 MappedStatement |
MapperRegistry | 掃描 Mapper 接口 |
SqlMethod 枚舉 | 定義所有默認(rèn) SQL 模板(如 INSERT, SELECT_BY_ID) |
?? 六、MP 如何生成默認(rèn) SQL?
MP 在啟動(dòng)時(shí),為每個(gè) BaseMapper 方法預(yù)定義了 SQL 模板:
public enum SqlMethod {
INSERT("insert", "插入一條數(shù)據(jù)", "<script>INSERT INTO %s %s VALUES %s</script>");
// 更多...
}
通過(guò) AbstractMethod 實(shí)現(xiàn)類(lèi)(如 Insert)生成 MappedStatement:
// org.apache.ibatis.session.Configuration mappedStatements.put(ms.getId(), ms); // 注冊(cè)到 MyBatis 全局配置
調(diào)用 userMapper.insert(user) 時(shí),實(shí)際執(zhí)行的是這個(gè)預(yù)生成的 SQL。
?? 七、與原生 MyBatis 集成對(duì)比
| 功能 | 原生 MyBatis | MyBatis-Plus |
|---|---|---|
| CRUD SQL | 手寫(xiě)(XML 或注解) | 自動(dòng)生成 |
| 分頁(yè) | 手寫(xiě)或 PageHelper 插件 | 內(nèi)置 Page<T> + PaginationInnerInterceptor |
| 邏輯刪除 | 手動(dòng)寫(xiě) WHERE deleted=0 | 配置 mybatis-plus.global-config.db-config.logic-delete-value |
| 字段自動(dòng)填充 | 自定義 MetaObjectHandler | 支持 @TableField(fill = FieldFill.INSERT) |
| 代碼生成 | 手動(dòng)或第三方工具 | 內(nèi)置 AutoGenerator |
| 配置方式 | 手動(dòng)配置 SqlSessionFactoryBean | 自動(dòng)配置,零配置啟動(dòng) |
? 八、常見(jiàn)配置(application.yml)
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.entity
configuration:
map-underscore-to-camel-case: true
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
auto-mapping-behavior: full?? 九、注意事項(xiàng)與坑點(diǎn)
| 問(wèn)題 | 解決方案 |
|---|---|
Mapped Statements collection does not contain... | 檢查 @MapperScan 是否掃描到 Mapper 接口 |
| 分頁(yè)無(wú)效 | 確保 MybatisPlusInterceptor 中注冊(cè)了 PaginationInnerInterceptor |
| 邏輯刪除不生效 | 檢查實(shí)體類(lèi)字段是否有 @TableLogic 注解 |
| 多數(shù)據(jù)源沖突 | 使用 dynamic-datasource-spring-boot-starter + @DS |
| 自定義 SQL 與 MP 沖突 | 使用 @Options(useCache = false, flushCache = FlushCachePolicy.TRUE) |
? 總結(jié):MyBatis-Plus 與 Spring Boot 集成的本質(zhì)
MyBatis-Plus = MyBatis + Auto Configuration + Default SQL + Core Plugins
| 核心思想 | 說(shuō)明 |
|---|---|
| 零配置啟動(dòng) | 通過(guò) mybatis-plus-boot-starter 自動(dòng)裝配 |
| 無(wú)侵入增強(qiáng) | 不改變 MyBatis 核心,只做擴(kuò)展 |
| 約定優(yōu)于配置 | 提供合理的默認(rèn)值(如分頁(yè)、ID 生成) |
| 插件化設(shè)計(jì) | 所有功能通過(guò) InnerInterceptor 實(shí)現(xiàn) |
如果你需要:
- MyBatis-Plus 分頁(yè)執(zhí)行流程圖(Mermaid)
- 自動(dòng)填充源碼分析
- 代碼生成器(Code Generator)原理
歡迎繼續(xù)提問(wèn),我可以為你生成對(duì)應(yīng)的源碼圖解與實(shí)戰(zhàn)示例!
到此這篇關(guān)于MyBatis-Plus 與 Spring Boot 集成原理實(shí)戰(zhàn)示例的文章就介紹到這了,更多相關(guān)MyBatis-Plus 與 Spring Boot 集成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ES6學(xué)習(xí)筆記之新增數(shù)據(jù)類(lèi)型實(shí)例解析
這篇文章主要介紹了ES6學(xué)習(xí)筆記之新增數(shù)據(jù)類(lèi)型,結(jié)合實(shí)例形式分析了ES6數(shù)據(jù)解構(gòu)賦值、新增數(shù)據(jù)類(lèi)型Set集合、新增數(shù)據(jù)類(lèi)型Map、Symbol類(lèi)型等相關(guān)原理與操作注意事項(xiàng),需要的朋友可以參考下2020-01-01
Java 集合框架之List 的使用(附小游戲練習(xí))
這篇文章主要介紹Java 集合框架中List 的使用,下面文章將圍繞Java 集合框架中List 的使用展開(kāi)話題,并附上一些小游戲練習(xí),需要的朋友可以參考一下2021-10-10
springmvc 分頁(yè)查詢(xún)的簡(jiǎn)單實(shí)現(xiàn)示例代碼
我們?cè)陂_(kāi)發(fā)項(xiàng)目中很多項(xiàng)目都用到列表分頁(yè)功能,本篇介紹了springmvc 分頁(yè)查詢(xún)的簡(jiǎn)單實(shí)現(xiàn)示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01
Spring Data Jpa多表查詢(xún)返回自定義實(shí)體方式
這篇文章主要介紹了Spring Data Jpa多表查詢(xún)返回自定義實(shí)體方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Guava事件總線應(yīng)用場(chǎng)景最佳實(shí)踐
這篇文章主要為大家介紹了Guava事件總線應(yīng)用場(chǎng)景最佳實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Java使用elasticsearch基礎(chǔ)API使用案例講解
這篇文章主要介紹了Java使用elasticsearch基礎(chǔ)API使用案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Spring Boot單元測(cè)試中使用mockito框架mock掉整個(gè)RedisTemplate的示例
今天小編就為大家分享一篇關(guān)于Spring Boot單元測(cè)試中使用mockito框架mock掉整個(gè)RedisTemplate的示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
使用JMeter進(jìn)行接口高并發(fā)測(cè)試的實(shí)現(xiàn)
本文主要介紹了使用JMeter進(jìn)行接口高并發(fā)測(cè)試的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

