01-SpringBoot整合MySQL完整搭建:驱动配置、数据源、连接池一步到位
SpringBoot整合MySQL完整搭建驱动配置、数据源、连接池一步到位黒漂技术佬 · 2026年7月前言不管你是在做智慧农业大棚的温湿度采集系统还是在搞无人售货柜的订单后台——数据存在哪里答案是数据库。存文件那是在远古时代才干的蠢事现在谁还敢把订单信息往txt里塞老板第一个飞过来打你。而 Java 生态里最成熟的搭配无非就是SpringBoot MySQL。SpringBoot 帮你搞定配置和工程骨架MySQL 负责踏实存数据中间再搭一座桥——JDBC 驱动和连接池。今天这篇文章咱就从零开始把这座桥搭得明明白白。读完这篇你就能在自己的 SpringBoot 项目里顺畅地读写 MySQL连时区不对“SSL 报错”连接池耗尽这些鬼问题都能自己排查解决。一、SpringBoot 项目骨架先不管别的把 SpringBoot 项目搭起来。你可以用 Spring Initializr 勾选依赖也可以直接手写 pom.xml。我建议新手用 Initializr 走一遍感受一下下一代工程搭建的便利。核心依赖就这三个!-- SpringBoot Web 启动器 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- MySQL 驱动 --dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependency!-- MyBatis-Plus 启动器自带 MyBatis --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.5/version/dependency小贴士mysql-connector-j是 MySQL 8.x 的驱动包名如果你还在用 5.x会看到mysql-connector-java那是老古董写法了。scope 设runtime就行编译期不需要它参与。如果不喜欢 MyBatis-Plus只想要原味 MyBatis换成mybatis-spring-boot-starter也可。但后面文章会介绍 MyBatis-Plus 的威力届时代码量能少一半所以咱提前布个局。二、数据源配置让 SpringBoot 认识你的 MySQL认识了谁当然是你的 MySQL 服务。在src/main/resources/application.yml里敲下这几行spring:datasource:url:jdbc:mysql://localhost:3306/smart_retail?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghaiusername:rootpassword:your_password_heredriver-class-name:com.mysql.cj.jdbc.Driver逐一解释参数含义容易踩的坑urlJDBC 连接串指定主机、端口、数据库名库名要提前建好别写了smart_retail回头 MySQL 里根本没这个库username/password不多说就是登录凭证生产环境别写明文后面讲配置中心时会展开driver-class-nameJDBC 驱动类全限定名MySQL 8.x 用com.mysql.cj.jdbc.Driver5.x 用com.mysql.jdbc.Driver一个很重要的参数serverTimezone。不写的后果是 Connector/J 抛出The server time zone value Öйú±ê׼ʱ¼ä is unrecognized中文字符在时区协商时翻了车报错信息都成乱码。一律设Asia/Shanghai或GMT%2B8一劳永逸。SSL 怎么办MySQL 8.x 默认开启 SSL而开发环境的数据库大概率没配证书。要么在 url 后面拼useSSLfalse简单粗暴仅限开发环境要么正经配 SSL。生产环境当然选后者但今天我们先把路走通。三、连接池为什么你需要它有人问“我直接每次请求建一个连接用完关掉不行吗”答案是当然不行。TCP 三次握手 MySQL 用户认证 线程创建的开销在高并发下能把你的服务拖死。设想一下无人售货柜每天早上 8 点统一结算100 台柜子同时请求——如果每次都新建连接你的数据库瞬间就会被连接洪流冲垮。连接池的核心思想提前创建一批连接请求来了直接借一个用用完还回去连接的创建和销毁由池子统一管理极大降低开销。四、HikariCPSpringBoot 的默认连接池SpringBoot 2.x 开始默认连接池从 Tomcat JDBC Pool 换成了HikariCP。这名字取自日语光ひかり寓意轻快如光事实也确实如此——它是目前 Java 界最快的连接池benchmark 数据非常能打。你什么都不写SpringBoot 就已经帮你配好了 HikariCP。但如果想精细调参加上这些spring:datasource:hikari:maximum-pool-size:20# 池中最大连接数minimum-idle:5# 池中最小空闲连接数connection-timeout:30000# 等待连接的超时时间(ms)idle-timeout:600000# 空闲连接最大存活时间(ms)max-lifetime:1800000# 连接最大生命周期(ms)connection-test-query:SELECT 1# 连接探活SQL参数解读maximum-pool-size上限默认 10。一台无人售货柜后台大概 20~30 个并发设 20 足够了。真要扛几百并发得综合考虑 CPU 核心数、MySQL 的max_connections等因素。minimum-idle保持几个待命兵默认和maximum-pool-size相同。建议设为 5太低响应慢太高浪费资源。connection-timeout排队等连接的极限时长超时就抛SQLTransientConnectionException。默认 30000ms30秒如果你的接口 SLA 是 3 秒响应这里设 5000 更合适。idle-timeout和max-lifetime强相关的两个参数。max-lifetime应比数据库的wait_timeout短 2~3 分钟避免 MySQL 主动断连接了池子还不知道用的时候发现连接已死。智慧农业场景大棚里几十个传感器每分钟上报一次数据这种闲时长、波峰集中的模式minimum-idle设小一点idle-timeout短一点既省资源又不影响业务。每个传感器上报只是 insert 一条记录拿到连接 10ms 就完事没必要长期占着。五、Druid连接池中的重型坦克阿里开源的 Druid 也不容忽视。它的优势在于自带监控面板SQL 执行统计、耗时分布、连接池状态一目了然内置 SQL 防火墙对 SQL 注入有一定防护能力功能丰富连接泄漏检测、慢 SQL 记录、数据库密码加密等怎么用在 pom.xml 中加入dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.20/version/dependencyapplication.yml配置spring:datasource:type:com.alibaba.druid.pool.DruidDataSourcedruid:initial-size:5min-idle:5max-active:20stat-view-servlet:enabled:trueurl-pattern:/druid/*login-username:adminlogin-password:admin123web-stat-filter:enabled:truefilter:stat:enabled:truelog-slow-sql:trueslow-sql-millis:2000配置完启动项目访问http://localhost:8080/druid/就能看到监控面板。选型建议团队项目、需要运维监控 → Druid追求极致性能、轻量简单 → HikariCP。这俩不存在绝对优劣而是适用场景不同。对于无人售货柜这种 IOT 设备的后台数据表结构不复杂HikariCP 完全够用但如果有专门的 DBA 团队需要关注 SQL 质量Druid 的 SQL 监控面板是刚需。六、连接测试验证依赖和配置搞定之后写个测试类验证一下SpringBootTestclassDatabaseConnectionTest{AutowiredprivateDataSourcedataSource;TestvoidtestConnection()throwsSQLException{try(ConnectionconndataSource.getConnection()){assertNotNull(conn);System.out.println(数据库连接成功);System.out.println(连接池类型dataSource.getClass().getName());}}}跑一下看到控制台打印出HikariPool-1 - Starting...和HikariPool-1 - Start completed.就说明连接池初始化成功了。如果失败排查清单如下错误可能原因解决方案CommunicationsException: Communications link failureMySQL 服务没启动 / 端口错了 / 防火墙挡了netstat -anAccess denied for user用户名或密码错误去 MySQL 里SELECT user,host FROM mysql.user;确认Unknown database数据库名写错了或没建CREATE DATABASE smart_retail DEFAULT CHARACTER SET utf8mb4;Public Key Retrieval is not allowedMySQL 8.x 的 caching_sha2_password 认证问题url 加上allowPublicKeyRetrievaltrue时区报错没有设置 serverTimezoneurl 加上serverTimezoneAsia/Shanghai七、编码设置预防乱码从源头抓起有人写了个无人售货柜的广告管理系统结果货柜上的汉字广告全变成乱码大半夜被客户电话吵醒。血的教训。三层都要统一为utf8mb4支持 emoji 和生僻字spring:datasource:url:jdbc:mysql://localhost:3306/smart_retail?useUnicodetruecharacterEncodingutf-8数据库建库CREATEDATABASEsmart_retailCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;服务端 JVM 参数也建议加-Dfile.encodingUTF-8三层全对齐杜绝乱码。总结至此SpringBoot 与 MySQL 之间的桥梁就搭好了驱动引入 → 数据源配置 → 连接池选择 → 测试验证 → 常见坑排查一条龙搞定。记住几个关键决策点开发环境HikariCP 默认就够参数不用乱调需要监控上 Druid/druid/面板比你自己看日志强十倍encoding 必须统一jdbcUrl、数据库、JVM三处全设UTF-8桥搭好了下一篇我们就用 MyBatis 在这座桥上跑 SQL让数据真正流动起来。
