Spring Boot集成MySQL JDBC时驱动加载提示问题求助
解决Spring Boot中MySQL JDBC驱动加载失败问题
问题根源分析
你的项目存在几个关键问题导致驱动加载异常:
- 手动JDBC连接与Spring Boot自动配置冲突:自定义
Database类直接使用DriverManager获取连接,和Spring Boot通过starter-data-jpa/jdbc提供的自动数据源配置产生类加载冲突。 - 冗余依赖引发类路径混乱:
spring-boot-starter-web已经包含spring-web和spring-context,单独指定版本引入这两个依赖会破坏Spring Boot的依赖管理机制,可能导致类加载异常。 - 不必要的驱动显式加载:JDBC 4.0及以上版本(MySQL 8.0驱动符合规范)会通过SPI自动注册驱动,无需手动调用
Class.forName("com.mysql.cj.jdbc.Driver")。
分步解决方案
1. 清理POM.xml中的冗余依赖
移除单独引入的spring-web和spring-context,同时根据需求二选一保留spring-boot-starter-data-jdbc或spring-boot-starter-data-jpa(无需同时引入):
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.8</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>medica3</artifactId> <version>0.0.1-SNAPSHOT</version> <name>medica3</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 根据数据访问需求二选一 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2. 替换手动连接逻辑,使用Spring Boot自动配置的数据源
删除自定义的Database类,改用Spring Boot注入的DataSource来获取连接,推荐搭配JdbcTemplate简化操作:
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; @Component public class DatabaseService { private final DataSource dataSource; // 构造函数注入Spring自动配置的数据源 public DatabaseService(DataSource dataSource) { this.dataSource = dataSource; } public Connection getConnection() throws SQLException { return dataSource.getConnection(); } // 推荐使用JdbcTemplate替代原生JDBC操作 public JdbcTemplate getJdbcTemplate() { return new JdbcTemplate(dataSource); } }
3. 优化application.properties配置
添加时区参数避免MySQL时区错误,同时可省略driver-class-name(Spring Boot会根据URL自动推断驱动类):
spring.datasource.url=jdbc:mysql://localhost:3306/med?serverTimezone=UTC&useSSL=false spring.datasource.username=root spring.datasource.password= # 可选配置:Spring Boot可自动识别,可省略 # spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
4. 重新构建并启动项目
执行以下命令清理缓存并重新构建:
mvn clean install -U mvn spring-boot:run
补充检查点
- 确认本地MySQL服务正常运行,3306端口开放,目标数据库
med已创建。 - 检查Maven本地仓库中
mysql-connector-java-8.0.32.jar是否存在,若文件损坏可删除后重新执行mvn install。
内容的提问来源于stack exchange,提问作者Luis Rosúa
相关产品推荐
相关产品推荐

