MyBatis-Plus(MP)本身是 MyBatis 的增强工具,不包含数据源实现。在生产环境中,我们通常会将 MP 与高性能的第三方数据库连接池(如 Druid 或 HikariCP)集成,以提升数据库访问性能、监控能力与稳定性。
一、核心概念
1. 什么是数据源(DataSource)?
- 数据源是应用程序与数据库之间的桥梁,负责管理数据库连接(Connection)的创建、复用、释放。
- 它是 JDBC 规范的一部分,
javax.sql.DataSource
是其核心接口。
2. 常见第三方数据源对比
特性 | Druid(阿里开源) | HikariCP(Spring Boot 默认) |
---|---|---|
性能 | 高 | 极高(目前最快) |
监控能力 | 强大(内置监控页面、SQL 统计) | 简单(需集成 Micrometer) |
配置复杂度 | 中等 | 简单 |
SQL 防火墙 | 支持(可防御 SQL 注入) | 不支持 |
扩展性 | 高(支持插件机制) | 低 |
默认集成 | Spring Boot 需手动引入 | Spring Boot 2.0+ 默认 |
✅ 选择建议:
- 追求极致性能:选 HikariCP
- 需要监控、审计、防火墙:选 Druid
二、操作步骤(非常详细)
步骤 1:创建 Spring Boot 项目
确保 pom.xml
中包含以下依赖:
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.6</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok(可选) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
方案一:集成 HikariCP(Spring Boot 默认)
HikariCP 是 Spring Boot 的默认连接池,无需额外引入依赖,开箱即用。
步骤 2.1:配置 application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cjkj.cjkjfastapi.cjkjfastapi_1_0_0.driver.jdbc.Driver
# HikariCP 专属配置(可选)
hikari:
# 连接池名称
pool-name: HikariPool-1
# 最小空闲连接数
minimum-idle: 5
# 最大连接数
maximum-pool-size: 20
# 连接超时(毫秒)
connection-timeout: 30000
# 空闲连接超时(默认10分钟)
idle-timeout: 600000
# 连接最大存活时间(默认30分钟)
max-lifetime: 1800000
# 测试查询(可选)
connection-test-query: SELECT 1
步骤 2.2:MyBatis-Plus 配置(可选)
mybatis-plus:
configuration:
# 开启自动驼峰映射
map-underscore-to-camel-case: true
# 指定 Mapper XML 文件位置
mapper-locations: classpath:mapper/*.xml
# 实体扫描包
type-aliases-package: com.example.entity
步骤 2.3:启动类或配置类(无需额外配置)
HikariCP 会自动被 Spring Boot 加载,MyBatis-Plus 会自动注入 DataSource
。
方案二:集成 Druid(推荐用于监控场景)
步骤 3.1:添加 Druid 依赖
<!-- Druid Spring Boot Starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.20</version>
</dependency>
⚠️ 注意:不要引入
druid-core
,应使用druid-spring-boot-starter
以获得自动配置支持。
步骤 3.2:配置 application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cjkj.cjkjfastapi.cjkjfastapi_1_0_0.driver.jdbc.Driver
# 指定使用 Druid 数据源
type: com.alibaba.druid.pool.DruidDataSource
# Druid 专属配置
druid:
# 连接池配置
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 扩展插件(监控、防火墙等)
filters: stat,wall,log4j # 常用:stat(监控)、wall(防火墙)
# SQL 监控配置
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
# 监控页面配置
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: false
login-username: admin
login-password: admin123
allow: 127.0.0.1
deny:
步骤 3.3:创建 Druid 配置类(可选,用于自定义)
@Configuration
@EnableTransactionManagement
@MapperScan("com.example.mapper")
public class DruidConfig {
@Bean
@ConfigurationProperties("spring.datasource.druid")
public DataSource druidDataSource() {
return new DruidDataSource();
}
/**
* 配置 Druid 的 StatFilter(SQL 监控)
*/
@Bean
public FilterRegistrationBean<WebStatFilter> webStatFilter() {
FilterRegistrationBean<WebStatFilter> filterRegistration = new FilterRegistrationBean<>();
filterRegistration.setFilter(new WebStatFilter());
filterRegistration.addUrlPatterns("/*");
filterRegistration.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistration;
}
/**
* 配置监控页面 Servlet
*/
@Bean
public ServletRegistrationBean<StatViewServlet> statViewServlet() {
ServletRegistrationBean<StatViewServlet> servletRegistration = new ServletRegistrationBean<>();
servletRegistration.setServlet(new StatViewServlet());
servletRegistration.addUrlMappings("/druid/*");
servletRegistration.addInitParameter("resetEnable", "false");
servletRegistration.addInitParameter("loginUsername", "admin");
servletRegistration.addInitParameter("loginPassword", "admin123");
return servletRegistration;
}
}
✅ 启动后访问:
http://localhost:8080/druid
查看监控页面。
三、常见错误与解决方案
错误现象 | 原因 | 解决方案 |
---|---|---|
ClassNotFoundException: DruidDataSource |
未引入 druid-spring-boot-starter |
检查依赖是否正确 |
监控页面打不开 | stat-view-servlet.enabled=false 或路径错误 |
检查 YAML 配置 |
连接池耗尽 | max-active 设置过小或连接未释放 |
增大连接数,检查代码是否关闭资源 |
SQL 监控不显示 | filters 未包含 stat |
添加 stat 到 filters |
Hikari 报连接超时 | connection-timeout 过短 |
调整超时时间 |
四、注意事项
不要同时引入 Druid 和 HikariCP:
- Spring Boot 会自动选择一个,可能导致配置混乱。
- 明确选择一个连接池。
Druid 的
filters
配置:stat
:启用监控wall
:SQL 防火墙(可防御注入)log4j
:日志输出(需引入日志依赖)
生产环境关闭
reset-enable
:reset-enable: false
合理设置连接池参数:
max-active
一般设为 CPU 核心数 × 2 ~ 4- 避免设置过大导致数据库连接数耗尽
五、使用技巧
1. 动态切换数据源(多数据源场景)
使用 AbstractRoutingDataSource
+ @DS
注解(MP 提供)实现多数据源。
@Service
@DS("slave") // 指定数据源
public class UserService {
// 查询走从库
}
2. 监控 SQL 性能瓶颈
- Druid 监控页面可查看:
- SQL 执行次数、耗时、并发
- 慢 SQL 统计(可设置
slow-sql-millis
) - 连接池状态
3. HikariCP 性能调优技巧
spring:
datasource:
hikari:
# 使用高性能驱动(如 MySQL 8+)
driver-class-name: com.mysql.cj.jdbc.Driver
# 启用连接池日志
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
六、最佳实践与性能优化
实践 | 说明 |
---|---|
✅ 生产环境必用连接池 | 禁用默认 HikariCP 或使用 Druid |
✅ Druid 用于需要监控的系统 | 如金融、电商等关键业务 |
✅ HikariCP 用于追求极致性能的系统 | 如高并发 API 服务 |
✅ 合理设置连接池大小 | 避免过小(性能差)或过大(压垮 DB) |
✅ 开启连接测试 | test-while-idle: true 防止连接失效 |
✅ 慢 SQL 告警 | Druid 可配置慢 SQL 日志,结合 ELK 告警 |
⚡ 性能优化建议
预编译语句缓存(HikariCP):
spring.datasource.hikari.data-source-properties.cachePrepStmts: true
Druid 开启 PSCache:
spring.datasource.druid.connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
连接池健康检查:
- 定期检查
DataSource
状态(如通过 Actuator)。
- 定期检查
数据库连接数匹配:
- 连接池最大连接数 ≤ 数据库
max_connections
。
- 连接池最大连接数 ≤ 数据库
七、总结对比
场景 | 推荐数据源 | 理由 |
---|---|---|
快速开发、API 服务 | HikariCP | 性能最好,配置简单 |
金融、电商、需监控 | Druid | 监控强大,防火墙安全 |
多数据源、读写分离 | Druid | 支持更丰富扩展 |
微服务、云原生 | HikariCP | 轻量、启动快 |
八、验证集成是否成功
启动应用,查看日志:
[INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
或
[INFO] com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited
访问
/actuator/health
查看数据源状态。对于 Druid,访问
/druid
查看监控页面。
结语
MyBatis-Plus 本身不提供数据源,必须与第三方连接池(Druid/HikariCP)集成才能发挥最大效能。
- HikariCP:追求“快”,适合性能敏感型应用。
- Druid:追求“稳+控”,适合需要监控与安全的生产系统。
合理配置连接池参数、开启监控、避免连接泄漏,是保障系统稳定的关键。掌握两者集成方式,你就能在不同业务场景下做出最优选择。