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

8次阅读

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

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

Spring JDBC 不是“要手动写连接池 +try-catch 关资源”的老路子,而是用 JdbcTemplate 把模板逻辑收走,你只管写 SQL 和处理结果——但前提是数据源配对、驱动版本匹配、SQL 语法不越界。

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

关键不是写死 DriverManager.getConnection(……),而是交由 Spring 管理 DataSource 实例。Spring Boot 下最简方式是靠 spring-boot-starter-jdbc + application.yml 配置自动装配;传统 XML 方式则需显式声明 BasicDataSourceComboPooledDataSource bean,并用 加载 jdbc.properties

  • Spring Boot 推荐用 spring.datasource.urlusernamepassword 直接配置,不用自己 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, ListbatchArgs),比循环调 update() 快一个数量级

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

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

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

最容易被忽略的一点:JDBC 操作默认不开启事务。如果一个方法里先 insert 再 update,中间出错,前一条不会自动回滚——必须显式加 @Transactional,且确保该方法是被 Spring 代理的对象调用(不能 self-invocation)。

text=ZqhQzanResources