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

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

相关推荐
仙人球部落 揞殺14 分钟前
细说ASP.NET的各种异步操作
后端·asp.net
卷无止境2 小时前
当独立开发者也能造出3A画质的游戏:Godot引擎深度解析
后端·python·godot
vx-程序开发3 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
攻城有术3 小时前
专项攻克——spring、springMVC、springBoot、springCloud的启动流程
spring boot·spring·spring cloud
独行侠影a3 小时前
SpringBoot 分布式锁实战:Redisson 解决订单超卖并发问题
spring boot·分布式·后端
妙码生花4 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十八):后台系统配置管理实现
前端·后端·go
IT_陈寒4 小时前
Java并行流把我坑惨了:原来不是线程安全的!
前端·人工智能·后端
Lihua奏5 小时前
跨域:浏览器到底拦住了什么
后端
Lyra_Infra6 小时前
Docker OCI Runtime 启动失败问题排查与解决
后端·docker·架构