一、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(自动配置核心)
📌 核心流程:
-
加载
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports -
读取所有 自动配置类
MybatisAutoConfiguration DataSourceAutoConfiguration WebMvcAutoConfiguration ... -
根据 条件注解 决定是否生效
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 标题
直接告诉我你打算 学习 / 面试 / 发博客 用 👍