最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus 與 Spring Boot 集成原理實(shí)戰(zhàn)示例

 更新時(shí)間:2025年08月14日 14:53:58   作者:csdn_tom_168  
MyBatis-Plus通過自動(dòng)配置與核心組件集成SpringBoot實(shí)現(xiàn)零配置,提供分頁、邏輯刪除等插件化功能,增強(qiáng)MyBatis而無需手寫SQL,簡化開發(fā)流程,本文給大家介紹MyBatis-Plus與Spring Boot集成原理實(shí)戰(zhàn)示例,感興趣的朋友一起看看吧

下面是對(duì) MyBatis-Plus 與 Spring Boot 集成原理的源碼級(jí)深度分析,涵蓋自動(dòng)配置、核心組件、啟動(dòng)流程、關(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
  • 自動(dòng)分頁插件
  • 邏輯刪除
  • 自動(dòng)填充字段(如 create_time
  • 代碼生成器
  • 性能分析插件

它并不是替代 MyBatis,而是對(duì) MyBatis 的“增強(qiáng) + 自動(dò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,它會(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)配置類,由 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):

功能說明
自動(dòng)注入全局配置GlobalConfig(ID 生成策略、邏輯刪除等)
自動(dòng)注冊核心插件PaginationInnerInterceptor(分頁)、LogicDeleteInnerInterceptor(邏輯刪除)
支持 @DS 多數(shù)據(jù)源集成 dynamic-datasource-spring-boot-starter
// 自動(dòng)添加分頁插件
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)造器自動(dòng)生成)。
  • 無需 XML 或 @Select 注解,即可使用 CRUD。

?? 原理:MP 在啟動(dòng)時(shí),通過 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)一注冊到 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邏輯刪除(自動(dòng)改寫 SQL:WHERE deleted=0
BlockAttackInnerInterceptor阻止無 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(通過 SqlMethod 枚舉)]
    G --> H[注冊 MappedStatement]
    H --> I[注入 MybatisPlusInterceptor]
    I --> J[Mapper 代理對(duì)象創(chuàng)建]
    J --> K[Service 層注入 Mapper]
    K --> L[應(yīng)用就緒]

關(guān)鍵源碼入口:

作用
MybatisPlusAutoConfiguration自動(dòng)配置主類
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 在啟動(dòng)時(shí),為每個(gè) 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í),實(shí)際執(zhí)行的是這個(gè)預(yù)生成的 SQL。

?? 七、與原生 MyBatis 集成對(duì)比

功能原生 MyBatisMyBatis-Plus
CRUD SQL手寫(XML 或注解)自動(dòng)生成
分頁手寫或 PageHelper 插件內(nèi)置 Page<T> + PaginationInnerInterceptor
邏輯刪除手動(dòng)寫 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)

? 八、常見配置(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

核心思想說明
零配置啟動(dòng)通過 mybatis-plus-boot-starter 自動(dòng)裝配
無侵入增強(qiáng)不改變 MyBatis 核心,只做擴(kuò)展
約定優(yōu)于配置提供合理的默認(rèn)值(如分頁、ID 生成)
插件化設(shè)計(jì)所有功能通過 InnerInterceptor 實(shí)現(xiàn)

如果你需要:

  • MyBatis-Plus 分頁執(zhí)行流程圖(Mermaid)
  • 自動(dòng)填充源碼分析
  • 代碼生成器(Code Generator)原理

歡迎繼續(xù)提問,我可以為你生成對(duì)應(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)文章

  • SpringCloud Ribbon與OpenFeign詳解如何實(shí)現(xiàn)服務(wù)調(diào)用

    SpringCloud Ribbon與OpenFeign詳解如何實(shí)現(xiàn)服務(wù)調(diào)用

    這篇文章主要介紹了SpringCloud Ribbon與OpenFeign實(shí)現(xiàn)服務(wù)調(diào)用的過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • ByteArrayOutputStream與InputStream互相轉(zhuǎn)換方式

    ByteArrayOutputStream與InputStream互相轉(zhuǎn)換方式

    這篇文章主要介紹了ByteArrayOutputStream與InputStream互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring?AOP注解配置與XML配置雙實(shí)戰(zhàn)教程

    Spring?AOP注解配置與XML配置雙實(shí)戰(zhàn)教程

    本文詳細(xì)介紹了面向切面編程(AOP)的概念、快速入門、核心概念、切點(diǎn)確定、通知分類、獲取被增強(qiáng)方法相關(guān)信息、應(yīng)用案例、XML配置、多切面順序問題以及AOP原理中的動(dòng)態(tài)代理,通過實(shí)例展示了如何在Spring框架中使用AOP進(jìn)行方法增強(qiáng),感興趣的朋跟隨小編一起看看吧
    2025-11-11
  • Java爬蟲爬取漫畫示例

    Java爬蟲爬取漫畫示例

    這篇文章主要介紹了Java爬蟲爬取漫畫示例,大部分的爬蟲入門教學(xué)都是爬取圖片的,本文就來測試一下爬取網(wǎng)站的漫畫,需要的朋友可以參考下
    2023-04-04
  • SWT(JFace)體驗(yàn)之Sash(活動(dòng)控件)

    SWT(JFace)體驗(yàn)之Sash(活動(dòng)控件)

    SWT(JFace)體驗(yàn)之Sash(活動(dòng)控件)
    2009-06-06
  • java如何用遞歸方法求階乘

    java如何用遞歸方法求階乘

    這篇文章主要介紹了java 用遞歸方法求階乘的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringMVC自定義參數(shù)綁定實(shí)現(xiàn)詳解

    SpringMVC自定義參數(shù)綁定實(shí)現(xiàn)詳解

    這篇文章主要介紹了SpringMVC自定義參數(shù)綁定實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解IntelliJ IDEA 自定義方法注解模板

    詳解IntelliJ IDEA 自定義方法注解模板

    本篇文章主要介紹了IntelliJ IDEA 自定義方法注解模板,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • mybatis的坑-integer類型為0的數(shù)據(jù)if?test失效問題

    mybatis的坑-integer類型為0的數(shù)據(jù)if?test失效問題

    這篇文章主要介紹了mybatis的坑-integer類型為0的數(shù)據(jù)if?test失效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 使用poi 導(dǎo)入Excel數(shù)據(jù)到數(shù)據(jù)庫的步驟

    java 使用poi 導(dǎo)入Excel數(shù)據(jù)到數(shù)據(jù)庫的步驟

    這篇文章主要介紹了java 使用poi 導(dǎo)入Excel 數(shù)據(jù)到數(shù)據(jù)庫的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12

最新評(píng)論

北宁市| 同心县| 海伦市| 东海县| 泽库县| 仙游县| 金乡县| 清镇市| 邢台市| 马尔康县| 南丹县| 宜春市| 安庆市| 西安市| 名山县| 乌审旗| 西林县| 白水县| 赤城县| 新沂市| 微博| 承德市| 利川市| 宜春市| 汽车| 石阡县| 麻城市| 江源县| 集贤县| 文山县| 图们市| 佛山市| 宜宾市| 平罗县| 奉化市| 利辛县| 浑源县| 邵阳县| 汝南县| 南乐县| 怀集县|