Spring JDBC 不是“要手动写连接池+try-catch关资源”的老路子,而是用
JdbcTemplate把模板逻辑收走,你只管写 SQL 和处理结果——但前提是数据源配对、驱动版本匹配、SQL 语法不越界。
怎么让 Spring 自动管好数据库连接?
关键不是写死
DriverManager.getConnection(...),而是交由 Spring 管理
DataSource实例。Spring Boot 下最简方式是靠
spring-boot-starter-jdbc+
application.yml配置自动装配;传统 XML 方式则需显式声明
BasicDataSource或
ComboPooledDataSourcebean,并用
<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+ 已废弃,硬写会抛
ClassNotFoundExceptionURL 后缀建议带上
?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)。
