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 标题

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

相关推荐
Jasonakeke18 小时前
SpringBoot自动配置原理揭秘
java·spring boot·后端
C+-C资深大佬19 小时前
SSM 框架(Spring + SpringMVC + MyBatis)
java·spring·mybatis
IT_陈寒19 小时前
Vite热更新失灵?你可能漏了这个配置
前端·人工智能·后端
Ramble_Naylor19 小时前
东方通(TongWeb)SpringBoot开发指导
java·spring boot
uzong20 小时前
面试官:如何做好架构设计
后端·架构
Cosolar20 小时前
QwenPaw Agent 实现原理深度剖析
后端·面试·架构
JacksonMx20 小时前
@Transactional 最佳实践
java·spring boot·spring·性能优化
Sincerelyplz20 小时前
【AI会议纪要实践】mapReduce、RAG 与结构化输出
java·后端·agent
zavoryn20 小时前
后端接入 AI Agent:Tool Calling 网关、幂等与审计日志实战
后端·架构
swipe1 天前
混合检索 RAG 的工程化实践:不是多查几路,而是把召回、重排和上下文预算管好
后端·langchain·llm