欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2025年08月14日 14:53:58   作者:csdn_tom_168  
MyBatis-Plus通過(guò)自動(dòng)配置與核心組件集成SpringBoot實(shí)現(xiàn)零配置,提供分頁(yè)、邏輯刪除等插件化功能,增強(qiáng)MyBatis而無(wú)需手寫(xiě)SQL,簡(jiǎn)化開(kāi)發(fā)流程,本文給大家介紹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ì)比

功能原生 MyBatisMyBatis-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)型實(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 的使用(附小游戲練習(xí))

    這篇文章主要介紹Java 集合框架中List 的使用,下面文章將圍繞Java 集合框架中List 的使用展開(kāi)話題,并附上一些小游戲練習(xí),需要的朋友可以參考一下
    2021-10-10
  • 基于java涉及父子類(lèi)的異常詳解

    基于java涉及父子類(lèi)的異常詳解

    下面小編就為大家?guī)?lái)一篇基于java涉及父子類(lèi)的異常詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • springmvc 分頁(yè)查詢(xún)的簡(jiǎn)單實(shí)現(xiàn)示例代碼

    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
  • java解壓zip文件示例

    java解壓zip文件示例

    這篇文章主要介紹了java解壓zip文件示例,在獲得一個(gè)以Zip格式壓縮的文件之后,需要將其進(jìn)行解壓縮,還原成壓縮前的文件,下面是代碼示例
    2014-03-03
  • Spring Data Jpa多表查詢(xún)返回自定義實(shí)體方式

    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í)踐

    這篇文章主要為大家介紹了Guava事件總線應(yīng)用場(chǎng)景最佳實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java使用elasticsearch基礎(chǔ)API使用案例講解

    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的示例

    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)

    本文主要介紹了使用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

最新評(píng)論