Spring配置jdbc的最佳方式是Spring Boot的自动配置加application.yml,传统SSM项目再考虑XML方式;日常开发90%的配置工作都集中在连接参数、驱动和连接池三个点上。
两种主流方式,先对号入座
聊到spring配置jdbc,周围很多朋友第一反应是翻旧教程找XML,现在的项目分两派:继承了历史包袱的传统Spring MVC工程,以及新起的Spring Boot工程,两种工程的配置思路差别挺大,选错方向才会出现”配了半天连不上”的尴尬。
| 配置方式 | 典型场景 | 配置量 | 维护成本 |
|---|---|---|---|
| XML配置 | 老项目、SSM框架整合 | 3-4个文件 | 偏高 |
| Spring Boot配置 | 新服务、微服务架构 | 1个yml | 推荐 |
行业共识认为,新项目一律走Spring Boot路线,XML配置主要服务于存量系统的维护改造,如果你手上是遗留的SSM工程,那才需要关心下面讲的XML写法。
spring mvc配置jdbc的XML操作步骤
对还在维护SSM工程的同学,直接看这段,老规矩,咱们按操作路径一步步来,跟着做就能跑通。
第一步:引入mysql驱动和spring-jdbc依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.31</version>
</dependency>
没有spring-jdbc,后面用不了JdbcTemplate,到时候还得多写一堆原生的Connection管理代码,没必要。
第二步:建jdbc.properties数据库参数文件
在resources目录下建一个jdbc.properties,把连接信息收拢到一处,后续改库改密不用动XML:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/demo_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=your_password
第三步:spring.xml里装配dataSource和JdbcTemplate

核心配置集中在spring.xml里,注意context:property-placeholder要放在前面加载参数:
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
做一个简单的测试验证,在Service里注入JdbcTemplate,执行一条select 1:
Integer result = jdbcTemplate.queryForObject("select 1", Integer.class);
能查到值,说明spring mvc配置jdbc这条路走通了,很多团队在这个阶段会卡在driverClassName上,老项目用com.mysql.jdbc.Driver,新驱动要换成com.mysql.cj.jdbc.Driver,注意区分。
spring boot配置jdbc连接mysql的yaml写法
到了Spring Boot 2.x/3.x时代,spring配置jdbc这事儿简化到一个文件,别被自动配置吓到,本质还是Spring帮你干了背后的事,不用自己注册bean了。
找mysql驱动依赖
操作路径:pom.xml里加一个依赖,驱动、连接池、DataSource自动化全搞定:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
Spring Boot通过spring-boot-starter-data-jpa或spring-boot-starter-jdbc间接管理驱动版本,日常开发直接写starter即可,版本号交给父级BOM管,不用手填。
application.yml中配置数据源
最精简的spring boot配置jdbc连接mysql配置长这样:
spring:
datasource:
url: jdbc:mysql://localhost:3306/shop_db?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
username: root
password: root123
driver-class-name: com.mysql.cj.jdbc.Driver

这段配置面世以来基本是通用模板,mysql8以上版本必带serverTimezone参数,不指定时区必报时区异常。
验证连接
写个测试类,操作路径:项目test目录下新建spring boot测试,注入DataSource,打印连接状态:
@SpringBootTest
class DbConnectionTest {
@Autowired
private DataSource dataSource;
@Test
void checkConnection() throws Exception {
try (Connection conn = dataSource.getConnection()) {
System.out.println("connection ok: " + conn.getCatalog());
}
}
}
测试不报错,说明Spring Boot自动配置已经成功接管了jdbc连接管理,没做任何bean定义,靠自动配置完成的,这个对比很直观。
spring数据库连接池配置的实战细节
连接池是数据库连接配置绕不开的话题,很多新手在这块翻过车,Spring Boot 2.x以上默认使用HikariCP连接池,业界公认性能第一梯队。
HikariCP核心参数
没有特殊需求就用默认值,配置池大小有几个常用参数值得调:
spring:
datasource:
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
- maximum-pool-size:池中最大连接数,高并发接口才调大,别设太高撑爆数据库
- minimum-idle:最小空闲连接,调太高浪费资源
- connection-timeout:获取连接的超时时间,单位毫秒
常见翻车点排查
连接不上、超时
先用telnet 127.0.0.1 3306验证端口通不通,端口通了再看数据库侧的用户权限:
select user, host from mysql.user;
mysql8默认认证插件是caching_sha2_password,如果客户端驱动太老,也会报认证失败,要么升驱动,要么改用户插件为mysql_native_password,这条排查经验能解决相当一部分问题。
连接池耗尽、接口卡死
现象是服务偶发请求等待,日志出现connection is not available, request timed out

,多数情况下是连接没释入,检查代码里的数据库操作是否包裹在事务里,或者有没有手动获取Connection后忘记close,用JdbcTemplate治理,它会自动释放连接。
补充一个实战建议
配置明文密码不是好习惯,生产环境优先用环境变量注入或配置中心,操作路径:yml里写成${DB_PASSWORD}保留占位符,部署时从环境变量读取,代价最小,安全性提升明显。
从配置到运维的关键提醒
完成spring配置jdbc只是开始,数据库连接配置这层抽象,后续延伸的索引优化、慢查询治理才决定系统的性能上限,连接池从HikariCP切换到Druid,也只是改一个依赖和几行config的事,架构层面不会有任何影响。
多写一句给新手的话:遇到连接问题,按”驱动 > URL > 账号权限 > 网络连通性”的优先级去排查,顺序错了会走很多弯路,先把驱动版本对上,再谈其他,这个习惯能省一晚上排查时间。
相关问答
spring配置jdbc需要引入哪些依赖?
Spring传统工程需要加spring-jdbc和mysql-connector-java,再加事务管理用的spring-tx,Spring Boot工程引入spring-boot-starter-jdbc并声明mysql驱动即可,版本号交给父POM管理,如果做Web项目,spring-boot-starter-web已经传递引用了jdbc starter,无需重复声明。
spring配置jdbc的事务控制怎么处理?
Spring Boot下操作路径:在启动类加@EnableTransactionManagement,或者在Service方法上直接用@Transactional(Spring Boot会自动开启代理),XML方式需在配置文件里加<tx:annotation-driven transaction-manager="transactionManager"/>,并声明DataSourceTransactionManager bean,不配事务管理器直接注@Transactional不生效。
为什么spring boot配置jdbc后连接mysql还是报时区错误?
mysql8驱动对时区有严格校验。jdbc:mysql://localhost:3306/demo?serverTimezone=Asia/Shanghai,url后必须拼接时区参数,否则默认采用服务器UTC时区,本地连接会差8小时,更彻底的办法是在mysql服务端配置default-time-zone = '+08:00',这样即使连接串不写也能正常,多数云厂商RDS默认就是东八时区。
