mysql Spring JDBC怎么用_mysql整合Spring教程

来源:这里教程网 时间:2026-02-28 20:36:27 作者:

Spring JDBC 不是“要手动写连接池+try-catch关资源”的老路子,而是用

JdbcTemplate
把模板逻辑收走,你只管写 SQL 和处理结果——但前提是数据源配对、驱动版本匹配、SQL 语法不越界。

怎么让 Spring 自动管好数据库连接?

关键不是写死

DriverManager.getConnection(...)
,而是交由 Spring 管理
DataSource
实例。Spring Boot 下最简方式是靠
spring-boot-starter-jdbc
+
application.yml
配置自动装配;传统 XML 方式则需显式声明
BasicDataSource
ComboPooledDataSource
bean,并用
<property-placeholder></property-placeholder>
加载
jdbc.properties

Spring Boot 推荐用
spring.datasource.url
username
password
直接配置,不用自己 new 数据源
MySQL 8+ 必须用
com.mysql.cj.jdbc.Driver
,旧版
com.mysql.jdbc.Driver
在 8.0.23+ 已废弃,硬写会抛
ClassNotFoundException
URL 后缀建议带上
?serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf8mb4
,否则可能报时区错或中文乱码

JdbcTemplate 怎么安全地增删改查?

JdbcTemplate
本身无状态、线程安全,可被多个 DAO 共享。它不帮你生成 SQL,但能防止 SQL 注入(靠占位符
?
)、自动关闭 Statement/ResultSet、把
SQLException
转成更易懂的 unchecked 异常(如
DataAccessException
)。

增删改统一用
update(String sql, Object... args)
,例如:
jdbcTemplate.update("INSERT INTO user(name, age) VALUES (?, ?)", "Alice", 25);
单行查询用
queryForObject(String sql, RowMapper<t>, Object... args)</t>
,别直接用
queryForList
返回
Map<string object></string>
——类型丢失、易 NPE
批量操作用
batchUpdate(String sql, List<object> batchArgs)</object>
,比循环调
update()
快一个数量级

为什么执行 SQL 总报 “Column 'xxx' not found” 或 “Parameter index out of range”?

这两类错误几乎都源于 SQL 字符串和参数不严格对齐,而不是数据库本身问题。

Parameter index out of range
:传参个数 ≠ SQL 中
?
个数,常见于拼接了动态 WHERE 却没同步删参数,或误把
null
当有效参数传入
Column 'xxx' not found
RowMapper
里用了
rs.getString("xxx")
,但 SELECT 没选这个字段,或用了别名却仍按原名取(如
SELECT name AS username FROM user
,却写
rs.getString("name")
调试技巧:打开
spring.jpa.show-sql=true
(即使不用 JPA)或在
application.yml
logging.level.org.springframework.jdbc=DEBUG
,看真正执行的 SQL 和参数绑定值

最容易被忽略的一点:JDBC 操作默认不开启事务。如果一个方法里先 insert 再 update,中间出错,前一条不会自动回滚——必须显式加

@Transactional
,且确保该方法是被 Spring 代理的对象调用(不能 self-invocation)。

相关推荐