Spring自动管理数据库连接的关键是交由其配置DataSource实例,而非手动创建;Spring Boot推荐通过spring-boot-starter-jdbc与application.yml配置实现自动装配,并注意驱动类、URL参数及事务管理。

Spring JDBC 不是“要手动写连接池+try-catch关资源”的老路子,而是用 JdbcTemplate 把模板逻辑收走,你只管写 SQL 和处理结果——但前提是数据源配对、驱动版本匹配、SQL 语法不越界。
怎么让 Spring 自动管好数据库连接?
关键不是写死 DriverManager.getConnection(...),而是交由 Spring 管理 DataSource 实例。Spring Boot 下最简方式是靠 spring-boot-starter-jdbc + application.yml 配置自动装配;传统 XML 方式则需显式声明 BasicDataSource 或 ComboPooledDataSource bean,并用 加载 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,别直接用, Object... args) queryForList返回Map——类型丢失、易 NPE - 批量操作用
batchUpdate(String sql, List,比循环调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)。










