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

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

相关推荐
不吃香菜学java4 小时前
Redis的java客户端
java·开发语言·spring boot·redis·缓存
码事漫谈4 小时前
大模型输出的“隐性结构塌缩”问题及对策
前端·后端
小江的记录本5 小时前
【网络安全】《网络安全常见攻击与防御》(附:《六大攻击核心特性横向对比表》)
java·网络·人工智能·后端·python·安全·web安全
努力的小雨5 小时前
龙虾量化实战法(QClaw)
后端
橙露5 小时前
SpringBoot 整合 MinIO:分布式文件存储上传下载
spring boot·分布式·后端
小眼哥6 小时前
SpringBoot整合Vue代码生成exe运行程序以及windows安装包
vue.js·windows·spring boot
2401_895521347 小时前
【Spring Security系列】Spring Security 过滤器详解与基于JDBC的认证实现
java·后端·spring
一只大袋鼠7 小时前
MyBatis 入门详细实战教程(一):从环境搭建到查询运行
java·开发语言·数据库·mysql·mybatis
小码哥_常7 小时前
大文件上传不再卡顿:Spring Boot 分片上传、断点续传与进度条实现全解析
后端
_Evan_Yao8 小时前
RAG中的“Chunk”艺术:我试过10种切分策略后总结的结论
java·人工智能·后端·python·软件工程