一、什么是数据库连接池?
1. 本质
数据库连接池是管理数据库连接的 “缓冲池”,提前创建一定数量的数据库连接(Connection),程序需要操作数据库时直接从池里 “拿”,用完后 “还回池里”,避免重复创建和关闭连接。
2. 为什么需要它?
- 解决 “连接创建耗时” 问题:创建数据库连接需要验证账号、协商协议等步骤(类似去银行办业务先排队取号),频繁创建 / 关闭会严重拖慢性能。
- 控制资源占用:限制最大连接数(比如最多 20 个),防止大量并发请求创建过多连接,导致数据库崩溃(类似银行不会无限开柜台)。
- 提高稳定性:自动检测并替换失效连接(比如网络中断的连接),避免程序报错。
3. 常见实现
- 德鲁伊(Druid):阿里开源,带监控、防 SQL 注入等功能,国内常用。
- HikariCP:Spring Boot 默认,轻量高效,性能极佳。
二、MyBatis 与数据库连接池的关系?
1. 两者职责完全不同
- MyBatis:是 “SQL 映射工具”,负责把 Java 代码里的方法(比如
getUserById(1)
)翻译成 SQL 语句(select * from user where id=1
),并把数据库返回的结果转换成 Java 对象。** 它不负责创建或管理数据库连接 **。 - 数据库连接池:是 “连接管家”,负责创建、复用、回收数据库连接。** MyBatis 必须依赖连接池才能拿到连接执行 SQL**。
2. 协作流程(核心)
MyBatis执行SQL的步骤:
① 从连接池“借”一个现成的数据库连接(Connection);
② 用这个连接执行翻译好的SQL;
③ 执行完成后,把连接“还”回连接池(不是关闭);
④ 连接池把连接保存起来,等待下次被MyBatis或其他工具使用。
3. 依赖关系
没有连接池,MyBatis 每次执行 SQL 都要手动创建连接(像每次用车都买新车,用完就扔),效率极低;有了连接池,MyBatis 可以高效复用连接,性能提升 10 倍以上。
三、为什么没见过 MyBatis 的配置文件?
核心原因:Spring Boot 的 “自动配置” 帮你省了步骤
在 Spring Boot 项目中,只要你引入了 mybatis-spring-boot-starter
和 Druid 依赖,Spring Boot 会自动完成以下工作:
- 读取
application.yml
中的数据库配置(URL、账号、密码)和 Druid 连接池参数; - 创建 Druid 连接池实例(
DataSource
对象); - 自动把这个连接池 “传给” MyBatis,让 MyBatis 用它来获取数据库连接。
整个过程不需要你写 MyBatis 核心配置文件(mybatis-config.xml
),也不需要手动关联连接池,这就是 Spring Boot 的 “零配置” 优势。
具体流程:为什么不重复?
咱们用代码和配置文件演示,你会发现所有配置都集中在 application.yml
里,完全不重复:
1. 引入依赖(关键)
<!-- MyBatis 的 Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!-- Druid 的 Spring Boot Starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
2. 配置文件(application.yml
):所有参数集中在这里
spring:
datasource:
# 1. 数据库基础信息(连接池和 MyBatis 共用这部分)
url: jdbc:mysql://localhost:3306/bookstore?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# 2. Druid 连接池参数(只配一次)
druid:
max-active: 20
min-idle: 5
max-wait: 60000
# ... 其他 Druid 配置(如监控)
# 3. MyBatis 配置(只配 MyBatis 自身的参数,和连接池无关)
mybatis:
mapper-locations: classpath:mapper/*.xml # 指定 Mapper XML 路径
type-aliases-package: com.example.entity # 实体类别名包
configuration:
map-underscore-to-camel-case: true # 下划线转驼峰(如数据库字段 book_name → 实体类 bookName)
3. Spring Boot 自动做了什么?
- ** Druid 自动配置 :
druid-spring-boot-starter
会根据spring.datasource.druid
配置,创建一个DruidDataSource
实例(连接池),交给 Spring 容器管理。
- MyBatis 自动配置 **:mybatis-spring-boot-starter
会从 Spring 容器中找到上面的DruidDataSource
,自动把它设置为 MyBatis 的数据源(即 MyBatis 用这个连接池获取连接)。
整个过程中,** 数据库连接信息(URL、账号密码)只在 spring.datasource
下配置一次 **,连接池和 MyBatis 共享这部分信息,完全不会重复。
为什么搁这里没配置过 MyBatis 核心文件?
传统 SSM 项目中,需要手动写 mybatis-config.xml
并配置数据源,但 Spring Boot 通过以下方式简化了:
1.** 自动读取配置 :MyBatis 的参数(如 mapper-locations
)直接在 application.yml
的 mybatis
节点下配置,替代了 XML。
2. 自动关联连接池 **:Spring Boot 会自动把容器中的 DataSource
(这里是 Druid)传给 MyBatis,不用在 XML 中写 <dataSource>
标签。