SpringBoot2.x/3.x 默认 HikariCP,无需额外引入依赖;MyBatis/MyBatis-Plus 直接复用 Hikari 数据源,不需要额外配置 驱动:
mysql-connector-java 8.x,驱动类:com.mysql.cj.jdbc.Driver两个认证模式:
模式 A:
mysql_native_password(兼容老账号,迁移临时方案)模式 B:
caching_sha2_password(MySQL8 默认,分 SSL、本地 RSA 公钥、测试自动拉取公钥 3 种子场景)
Maven 依赖(基础必备)
<!-- SpringBoot JDBC 自带HikariCP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL Connector 8.x -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<!-- MyBatis 可选 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
SpringBoot3 注意:javax.* 包改为 jakarta.*,mybatis 版本对应升级,mysql 驱动可以继续 8.0.33。
场景 1:账号使用 mysql_native_password(老迁移场景,无需 RSA/SSL)
账号 SQL:
ALTER USER 'dbuser'@'%' IDENTIFIED WITH mysql_native_password BY 'Db@Pass123456'; FLUSH PRIVILEGES;
application.yml
spring:
datasource:
# JDBC URL:native认证不需要RSA参数
url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true
username: dbuser
password: Db@Pass123456
driver-class-name: com.mysql.cj.jdbc.Driver
# HikariCP 连接池完整参数
hikari:
# 连接池名称,便于监控
pool-name: Hikari-MySQL
# 最小空闲连接
minimum-idle: 5
# 最大连接数,根据业务调整,不要过大
maximum-pool-size: 20
# 空闲连接超时时间,单位ms,>10s
idle-timeout: 300000
# 连接最大生命周期,比mysql wait_timeout小(mysql默认wait_timeout=8小时)
max-lifetime: 1800000
# 获取连接超时
connection-timeout: 30000
# 测试连接有效性SQL
connection-test-query: SELECT 1
# 是否自动提交事务
auto-commit: true
# 连接泄漏检测,开发环境打开,生产按需
leak-detection-threshold: 2000
mybatis:
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.xxx.entity
场景 2:账号 caching_sha2_password(MySQL8 默认认证)
2.1 子场景:开启 SSL【✅生产推荐首选】
MySQL 服务端已配置 SSL 证书,链路加密,不需要 RSA 公钥参数
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true
username: dbuser
password: Db@Pass123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
pool-name: Hikari-MySQL
minimum-idle: 5
maximum-pool-size: 20
idle-timeout: 300000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
auto-commit: true
leak-detection-threshold: 2000
mybatis:
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.xxx.entity
2.2 子场景:内网无 SSL,本地预置 RSA 公钥文件【✅内网安全备选】
不开启 SSL,使用本地预存 mysql 公钥文件,禁止 allowPublicKeyRetrieval
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true&serverRsaPublicKeyFile=/opt/app/mysql_pubkey.pem
username: dbuser
password: Db@Pass123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
pool-name: Hikari-MySQL
minimum-idle: 5
maximum-pool-size: 20
idle-timeout: 300000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
auto-commit: true
mybatis:
mapper-locations: classpath:mapper/**/*.xml
2.3 子场景:内网测试,无 SSL,自动拉取公钥【❌仅测试,生产严禁】
allowPublicKeyRetrieval=true中间人风险,仅本地开发临时调试
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
username: dbuser
password: Db@Pass123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
pool-name: Hikari-MySQL
minimum-idle: 5
maximum-pool-size: 20
idle-timeout: 300000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
auto-commit: true
mybatis:
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.xxx.entity
Java Config 代码方式(非 yml,适合多数据源场景)
同样支持两种认证,只需要修改
jdbcUrl字符串即可
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
// ========= 切换不同认证,只改这个url =========
// mysql_native_password
// String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4";
// caching_sha2_password + SSL
String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/mydb?useSSL=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4";
config.setJdbcUrl(jdbcUrl);
config.setUsername("dbuser");
config.setPassword("Db@Pass123456");
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
// Hikari参数
config.setPoolName("Hikari-MySQL");
config.setMinimumIdle(5);
config.setMaximumPoolSize(20);
config.setIdleTimeout(300000);
config.setMaxLifetime(1800000);
config.setConnectionTimeout(30000);
config.setConnectionTestQuery("SELECT 1");
config.setAutoCommit(true);
return new HikariDataSource(config);
}
}
Hikari 关键参数说明(踩坑重点)
max-lifetime:必须小于 MySQL 的 wait_timeout。MySQL 默认
wait_timeout=28800(8 小时),这里设置 30 分钟 (1800000ms),避免连接被 mysql 服务端断开,Hikari 拿到死连接。connection-test-query: SELECT 1:HikariCP >= 2.4.0 支持isValid()检测,推荐可以不写,底层驱动自带校验,省去一次查询开销;如果数据库驱动老旧再开启。rewriteBatchedStatements=true:批量 insert/update 时开启,大幅提升 MyBatis 批量性能。
认证相关常见坑
认证插件是 caching_sha2_password,url 缺少 SSL/RSA 参数 → Public key retrieval is not allowed
生产:开启 SSL;测试临时加
allowPublicKeyRetrieval=true
账号插件 mysql_native_password,驱动 8.x 完全不需要 RSA 参数,加了也不报错,但多余
连接池参数和密码认证插件无关,认证逻辑全部在 JDBC 驱动,Hikari 只负责连接管理。
查看 mysql 账号认证插件 SQL
SELECT user,host,plugin FROM mysql.user WHERE user='dbuser';