Spring Boot 整合 MyBatis + 自动配置原理详解

一、Spring Boot 整合 MyBatis(完整示例)

1️⃣ pom.xml 依赖配置

复制代码
<dependencies>
    <!-- Web 起步依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- MyBatis 整合 Spring Boot -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.3.0</version>
    </dependency>

    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Druid 数据源 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.20</version>
    </dependency>
</dependencies>

📌 注意​

  • MySQL 8.x 驱动类应为:

    复制代码
    com.mysql.cj.jdbc.Driver
  • 不建议使用 mysql:mysql-connector-java老版本


2️⃣ application.yml 配置

复制代码
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?useSSL=false&serverTimezone=UTC
    username: root
    password: 1111
    type: com.alibaba.druid.pool.DruidDataSource

mybatis:
  mapper-locations: classpath:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true

✅ 推荐开启驼峰映射,减少 SQL 字段映射问题。


3️⃣ 启动类配置

复制代码
@SpringBootApplication
@MapperScan("com.hg.mapper")
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

📌 @MapperScan

  • 扫描 Mapper 接口

  • 替代在每个 Mapper 上加 @Mapper


二、Spring Boot 自动配置原理(核心重点)

@SpringBootApplication是一个组合注解,由三部分组成:


1️⃣ @SpringBootConfiguration

复制代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Configuration
public @interface SpringBootConfiguration {}

✅ 本质就是 @Configuration

✅ 标识当前类是一个 Spring 配置类​

✅ 启动类本身也是配置类


2️⃣ @EnableAutoConfiguration(最关键)

复制代码
@EnableAutoConfiguration
├── @AutoConfigurationPackage
└── @Import(AutoConfigurationImportSelector.class)

✅ ① @AutoConfigurationPackage
复制代码
@Import(AutoConfigurationPackages.Registrar.class)

🔹 作用:

  • 将 启动类所在包及其子包​ 注册为 Spring 扫描路径

  • 等价于自动完成 @ComponentScan

📌 这也是为什么:

Controller / Service / Mapper 必须放在启动类同级或子包下


✅ ② AutoConfigurationImportSelector(自动配置核心)

📌 核心流程:

  1. 加载

    复制代码
    META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  2. 读取所有 自动配置类

    复制代码
    MybatisAutoConfiguration
    DataSourceAutoConfiguration
    WebMvcAutoConfiguration
    ...
  3. 根据 条件注解​ 决定是否生效


3️⃣ 条件注解(@Conditional 系列)

注解 作用
@ConditionalOnClass classpath 存在指定类
@ConditionalOnMissingBean 容器中不存在指定 Bean
@ConditionalOnProperty 配置文件中存在指定属性
@ConditionalOnWebApplication Web 环境

📌 MyBatis 自动配置示例:

复制代码
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnMissingBean(DataSource.class)

👉 只要引入 mybatis-spring-boot-starter,并且配置了 datasource,MyBatis 就会自动生效。


4️⃣ @ComponentScan

复制代码
@ComponentScan

✅ 扫描:

  • @Controller

  • @Service

  • @Repository

  • @Component

✅ 与 @AutoConfigurationPackage配合,完成全量组件扫描


三、MyBatis 自动配置是如何完成的?

简化流程如下:

复制代码
引入 mybatis-spring-boot-starter
        ↓
MybatisAutoConfiguration 生效
        ↓
读取 application.yml 中的 datasource
        ↓
创建 SqlSessionFactory
        ↓
扫描 Mapper 接口
        ↓
生成 Mapper 代理对象并注入 Spring 容器

📌 这就是为什么:

只写 yml + Mapper 接口就能直接用 MyBatis


四、常见坑点总结(必看)

❌ 启动类位置不对 → Mapper 扫描不到

❌ MySQL 驱动类写错 → 启动报错

❌ yml 缩进错误 → 配置失效

❌ 忘记 @MapperScan→ Mapper 注入失败


五、总结一句话(面试必背)

Spring Boot 自动配置的本质是:通过 @EnableAutoConfiguration加载大量自动配置类,并结合条件注解,在满足条件时自动向 Spring 容器中注册 Bean,从而实现"约定优于配置"。


如果你愿意,我可以继续帮你:

  • ✅ 加 时序图

  • ✅ 加 MyBatis 自动配置源码逐行解析

  • ✅ 改成 面试问答版

  • ✅ 帮你起一个 爆款 CSDN 标题

直接告诉我你打算 学习 / 面试 / 发博客​ 用 👍

相关推荐
凤山老林7 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
朱涛的自习室8 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
woniu_maggie11 小时前
SAP MDG主数据治理实战:从架构原理到项目实施全解析
后端
xiaoqiMikko11 小时前
Redis 实战(一):内存满了 —— 拒写、淘汰、被系统杀掉,以及删了 key 内存为什么不降(6.2.4 实测)
redis·后端
工程师小爱11 小时前
电芯尺寸合格,不等于电池包尺寸合格
后端
geovindu11 小时前
rust:Memento Pattern(续)
开发语言·后端·设计模式·rust·行为模式·备忘录模
闲云lazycloud11 小时前
第 1 课:Harness 与 Agent 运行时
人工智能·后端
熊哈哈O_o11 小时前
260+异构同步链路:DDL语法自动翻译在大规模数据同步中的实现原理
后端
用户98883218717412 小时前
别把 IOptionsSnapshot 注入单例:从生命周期看 .NET 配置读取
后端