MyBatis-Plus 與 Spring Boot 集成原理實(shí)戰(zhàn)示例
下面是對 MyBatis-Plus 與 Spring Boot 集成原理的源碼級深度分析,涵蓋自動配置、核心組件、啟動流程、關(guān)鍵類解析以及與原生 MyBatis 的差異。通過本篇分析,你將徹底理解 MyBatis-Plus 是如何在 Spring Boot 環(huán)境中實(shí)現(xiàn)“開箱即用”的。
?? 一、MyBatis-Plus 簡介
MyBatis-Plus(簡稱 MP) 是基于 MyBatis 的增強(qiáng)工具,完全兼容 MyBatis,提供了:
- 無需寫 SQL 的 CRUD 操作(
IService/BaseMapper) - 自動分頁插件
- 邏輯刪除
- 自動填充字段(如
create_time) - 代碼生成器
- 性能分析插件
它并不是替代 MyBatis,而是對 MyBatis 的“增強(qiáng) + 自動化”。
?? 二、集成方式(Spring Boot)
1. 引入依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>?? 注意:使用 mybatis-plus-boot-starter 而非 mybatis-plus,它會自動引入 mybatis-spring 并觸發(fā)自動配置。
?? 三、核心機(jī)制:自動配置(Auto Configuration)
1. 自動配置入口
Spring Boot 啟動時,會加載:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
內(nèi)容包含:
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
? 這是 MP 的自動配置類,由 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):
| 功能 | 說明 |
|---|---|
| 自動注入全局配置 | 如 GlobalConfig(ID 生成策略、邏輯刪除等) |
| 自動注冊核心插件 | 如 PaginationInnerInterceptor(分頁)、LogicDeleteInnerInterceptor(邏輯刪除) |
支持 @DS 多數(shù)據(jù)源 | 集成 dynamic-datasource-spring-boot-starter |
// 自動添加分頁插件
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)(通過 MP 內(nèi)部 SQL 構(gòu)造器自動生成)。 - 無需 XML 或
@Select注解,即可使用 CRUD。
?? 原理:MP 在啟動時,通過
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 將多個功能封裝為 Inner Interceptor,統(tǒng)一注冊到 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 | 分頁支持(替換 PageHelper) |
LogicDeleteInnerInterceptor | 邏輯刪除(自動改寫 SQL:WHERE deleted=0) |
BlockAttackInnerInterceptor | 阻止無 WHERE 條件的 UPDATE/DELETE |
TenantLineInnerInterceptor | 多租戶支持 |
?? 所有插件基于 MyBatis 的
Executor攔截機(jī)制實(shí)現(xiàn)。
?? 五、啟動流程源碼剖析
flowchart TD
A[Spring Boot 啟動] --> B[加載 MybatisPlusAutoConfiguration]
B --> C[創(chuàng)建 SqlSessionFactory]
C --> D[MybatisSqlSessionFactoryBean.build()]
D --> E[解析 Mapper 接口]
E --> F[MP 掃描 BaseMapper 子接口]
F --> G[生成默認(rèn) SQL(通過 SqlMethod 枚舉)]
G --> H[注冊 MappedStatement]
H --> I[注入 MybatisPlusInterceptor]
I --> J[Mapper 代理對象創(chuàng)建]
J --> K[Service 層注入 Mapper]
K --> L[應(yīng)用就緒]
關(guān)鍵源碼入口:
| 類 | 作用 |
|---|---|
MybatisPlusAutoConfiguration | 自動配置主類 |
MybatisSqlSessionFactoryBean | 構(gòu)建 SqlSessionFactory,注入 MP 特性 |
DefaultSqlSession | 執(zhí)行 SQL,MP 的 SQL 已注冊為 MappedStatement |
MapperRegistry | 掃描 Mapper 接口 |
SqlMethod 枚舉 | 定義所有默認(rèn) SQL 模板(如 INSERT, SELECT_BY_ID) |
?? 六、MP 如何生成默認(rèn) SQL?
MP 在啟動時,為每個 BaseMapper 方法預(yù)定義了 SQL 模板:
public enum SqlMethod {
INSERT("insert", "插入一條數(shù)據(jù)", "<script>INSERT INTO %s %s VALUES %s</script>");
// 更多...
}
通過 AbstractMethod 實(shí)現(xiàn)類(如 Insert)生成 MappedStatement:
// org.apache.ibatis.session.Configuration mappedStatements.put(ms.getId(), ms); // 注冊到 MyBatis 全局配置
調(diào)用 userMapper.insert(user) 時,實(shí)際執(zhí)行的是這個預(yù)生成的 SQL。
?? 七、與原生 MyBatis 集成對比
| 功能 | 原生 MyBatis | MyBatis-Plus |
|---|---|---|
| CRUD SQL | 手寫(XML 或注解) | 自動生成 |
| 分頁 | 手寫或 PageHelper 插件 | 內(nèi)置 Page<T> + PaginationInnerInterceptor |
| 邏輯刪除 | 手動寫 WHERE deleted=0 | 配置 mybatis-plus.global-config.db-config.logic-delete-value |
| 字段自動填充 | 自定義 MetaObjectHandler | 支持 @TableField(fill = FieldFill.INSERT) |
| 代碼生成 | 手動或第三方工具 | 內(nèi)置 AutoGenerator |
| 配置方式 | 手動配置 SqlSessionFactoryBean | 自動配置,零配置啟動 |
? 八、常見配置(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)
| 問題 | 解決方案 |
|---|---|
Mapped Statements collection does not contain... | 檢查 @MapperScan 是否掃描到 Mapper 接口 |
| 分頁無效 | 確保 MybatisPlusInterceptor 中注冊了 PaginationInnerInterceptor |
| 邏輯刪除不生效 | 檢查實(shí)體類字段是否有 @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
| 核心思想 | 說明 |
|---|---|
| 零配置啟動 | 通過 mybatis-plus-boot-starter 自動裝配 |
| 無侵入增強(qiáng) | 不改變 MyBatis 核心,只做擴(kuò)展 |
| 約定優(yōu)于配置 | 提供合理的默認(rèn)值(如分頁、ID 生成) |
| 插件化設(shè)計 | 所有功能通過 InnerInterceptor 實(shí)現(xiàn) |
如果你需要:
- MyBatis-Plus 分頁執(zhí)行流程圖(Mermaid)
- 自動填充源碼分析
- 代碼生成器(Code Generator)原理
歡迎繼續(xù)提問,我可以為你生成對應(yīng)的源碼圖解與實(shí)戰(zhàn)示例!
到此這篇關(guān)于MyBatis-Plus 與 Spring Boot 集成原理實(shí)戰(zhàn)示例的文章就介紹到這了,更多相關(guān)MyBatis-Plus 與 Spring Boot 集成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ES6學(xué)習(xí)筆記之新增數(shù)據(jù)類型實(shí)例解析
這篇文章主要介紹了ES6學(xué)習(xí)筆記之新增數(shù)據(jù)類型,結(jié)合實(shí)例形式分析了ES6數(shù)據(jù)解構(gòu)賦值、新增數(shù)據(jù)類型Set集合、新增數(shù)據(jù)類型Map、Symbol類型等相關(guān)原理與操作注意事項(xiàng),需要的朋友可以參考下2020-01-01
Java 集合框架之List 的使用(附小游戲練習(xí))
這篇文章主要介紹Java 集合框架中List 的使用,下面文章將圍繞Java 集合框架中List 的使用展開話題,并附上一些小游戲練習(xí),需要的朋友可以參考一下2021-10-10
springmvc 分頁查詢的簡單實(shí)現(xiàn)示例代碼
我們在開發(fā)項(xiàng)目中很多項(xiàng)目都用到列表分頁功能,本篇介紹了springmvc 分頁查詢的簡單實(shí)現(xiàn)示例代碼,非常具有實(shí)用價值,需要的朋友可以參考下。2017-01-01
Spring Data Jpa多表查詢返回自定義實(shí)體方式
這篇文章主要介紹了Spring Data Jpa多表查詢返回自定義實(shí)體方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Java使用elasticsearch基礎(chǔ)API使用案例講解
這篇文章主要介紹了Java使用elasticsearch基礎(chǔ)API使用案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Spring Boot單元測試中使用mockito框架mock掉整個RedisTemplate的示例
今天小編就為大家分享一篇關(guān)于Spring Boot單元測試中使用mockito框架mock掉整個RedisTemplate的示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
使用JMeter進(jìn)行接口高并發(fā)測試的實(shí)現(xiàn)
本文主要介紹了使用JMeter進(jìn)行接口高并發(fā)測試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

