1. 项目概述在Java企业级开发中Spring Boot凭借其约定优于配置的理念极大简化了项目搭建和开发流程。而数据库作为绝大多数应用的核心组件其连接与操作是开发者必须掌握的基础技能。本文将详细演示如何在本地开发环境中让Spring Boot项目与MySQL数据库建立连接并实现CRUD操作。对于刚接触Spring Boot的开发者而言数据库连接配置常会遇到各种坑驱动版本不匹配、时区设置问题、连接池配置不当等。我将结合多年实战经验从环境准备到完整实现手把手带你避开这些常见陷阱。2. 环境准备与项目创建2.1 基础环境要求在开始之前请确保本地已安装以下组件JDK 1.8或更高版本推荐JDK 11MySQL 5.7或8.0版本本文以MySQL 8.0.26为例IntelliJ IDEA或Eclipse开发工具Maven 3.6或Gradle 6.x注意MySQL 5.7与8.0在驱动类和连接参数上有差异后续配置时需特别注意2.2 初始化Spring Boot项目使用Spring Initializr创建项目时需要勾选以下关键依赖Spring Web用于构建Web层Spring Data JPA数据库操作MySQL Driver数据库连接驱动对于Maven项目pom.xml中应包含如下依赖dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency /dependencies3. 数据库配置详解3.1 MySQL本地服务准备首先在本地MySQL中创建数据库和用户CREATE DATABASE springboot_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER demo_userlocalhost IDENTIFIED BY Demo1234; GRANT ALL PRIVILEGES ON springboot_demo.* TO demo_userlocalhost; FLUSH PRIVILEGES;3.2 Spring Boot连接配置在application.properties中配置数据库连接# 数据源配置 spring.datasource.urljdbc:mysql://localhost:3306/springboot_demo?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 spring.datasource.usernamedemo_user spring.datasource.passwordDemo1234 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver # JPA配置 spring.jpa.show-sqltrue spring.jpa.hibernate.ddl-autoupdate spring.jpa.properties.hibernate.dialectorg.hibernate.dialect.MySQL8Dialect关键参数说明useSSLfalse本地开发时可禁用SSLserverTimezone必须设置避免时区问题ddl-auto开发环境可用update生产环境应设为validate踩坑提醒MySQL 8.0必须使用cj.jdbc.Driver传统驱动类已废弃4. 实体与Repository实现4.1 创建JPA实体类定义一个用户实体Entity Table(name users) public class User { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; Column(nullable false, unique true) private String username; Column(nullable false) private String password; // 省略getter/setter和构造方法 }4.2 编写Repository接口Spring Data JPA的强大之处在于只需定义接口public interface UserRepository extends JpaRepositoryUser, Long { User findByUsername(String username); Query(SELECT u FROM User u WHERE u.username LIKE %:keyword%) ListUser searchByKeyword(Param(keyword) String keyword); }5. 服务层与控制层实现5.1 业务服务实现Service Transactional public class UserService { Autowired private UserRepository userRepository; public User createUser(User user) { if (userRepository.existsByUsername(user.getUsername())) { throw new RuntimeException(用户名已存在); } return userRepository.save(user); } // 其他业务方法... }5.2 RESTful API设计RestController RequestMapping(/api/users) public class UserController { Autowired private UserService userService; PostMapping public ResponseEntityUser createUser(RequestBody User user) { return ResponseEntity.ok(userService.createUser(user)); } // 其他API端点... }6. 连接池优化配置默认的HikariCP连接池需要合理配置# 连接池配置 spring.datasource.hikari.connection-timeout30000 spring.datasource.hikari.maximum-pool-size20 spring.datasource.hikari.minimum-idle5 spring.datasource.hikari.idle-timeout600000 spring.datasource.hikari.max-lifetime1800000配置建议开发环境pool-size可设为5-10生产环境根据服务器核心数设置通常为核心数*2 1超时时间应根据业务特点调整7. 常见问题排查7.1 连接失败问题现象Communications link failure解决方案检查MySQL服务是否启动验证用户名密码是否正确确认连接URL中的数据库名无误检查防火墙是否阻止了3306端口7.2 时区问题现象The server time zone value is unrecognized解决确保连接URL中包含serverTimezoneAsia/Shanghai或其他对应时区7.3 驱动类问题现象Loading class com.mysql.jdbc.Driver is deprecated解决MySQL 8.0必须使用com.mysql.cj.jdbc.Driver8. 高级配置技巧8.1 多数据源配置当需要连接多个MySQL实例时Configuration EnableJpaRepositories( basePackages com.example.primary, entityManagerFactoryRef primaryEntityManager, transactionManagerRef primaryTransactionManager ) public class PrimaryDataSourceConfig { Bean ConfigurationProperties(spring.datasource.primary) public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } // 其他相关Bean配置... }8.2 监控连接池状态添加以下配置启用监控# 启用HikariCP监控 management.endpoint.hikari.enabledtrue management.endpoints.web.exposure.includehikari然后访问/actuator/hikari即可查看连接池状态9. 测试验证方案9.1 单元测试配置DataJpaTest AutoConfigureTestDatabase(replace AutoConfigureTestDatabase.Replace.NONE) public class UserRepositoryTest { Autowired private UserRepository userRepository; Test public void testSaveUser() { User user new User(test, password); User saved userRepository.save(user); assertNotNull(saved.getId()); } }9.2 集成测试示例SpringBootTest AutoConfigureMockMvc public class UserControllerTest { Autowired private MockMvc mockMvc; Test public void testCreateUser() throws Exception { String userJson {\username\:\test\,\password\:\123\}; mockMvc.perform(post(/api/users) .contentType(MediaType.APPLICATION_JSON) .content(userJson)) .andExpect(status().isOk()); } }10. 生产环境建议加密敏感配置使用Jasypt加密数据源密码spring.datasource.passwordENC(加密后的密码)连接池监控集成Prometheus监控连接池指标慢查询日志开启MySQL慢查询日志定期优化SQL备份策略配置定期数据库备份方案连接重试添加连接失败重试机制spring.datasource.hikari.initialization-fail-timeout30000在实际部署时建议将数据库配置移到外部化配置如Nacos配置中心中实现配置与代码分离。对于高频访问的应用可以考虑引入二级缓存如Redis减轻数据库压力。
Spring Boot连接MySQL数据库实战指南
发布时间:2026/7/3 10:36:50
1. 项目概述在Java企业级开发中Spring Boot凭借其约定优于配置的理念极大简化了项目搭建和开发流程。而数据库作为绝大多数应用的核心组件其连接与操作是开发者必须掌握的基础技能。本文将详细演示如何在本地开发环境中让Spring Boot项目与MySQL数据库建立连接并实现CRUD操作。对于刚接触Spring Boot的开发者而言数据库连接配置常会遇到各种坑驱动版本不匹配、时区设置问题、连接池配置不当等。我将结合多年实战经验从环境准备到完整实现手把手带你避开这些常见陷阱。2. 环境准备与项目创建2.1 基础环境要求在开始之前请确保本地已安装以下组件JDK 1.8或更高版本推荐JDK 11MySQL 5.7或8.0版本本文以MySQL 8.0.26为例IntelliJ IDEA或Eclipse开发工具Maven 3.6或Gradle 6.x注意MySQL 5.7与8.0在驱动类和连接参数上有差异后续配置时需特别注意2.2 初始化Spring Boot项目使用Spring Initializr创建项目时需要勾选以下关键依赖Spring Web用于构建Web层Spring Data JPA数据库操作MySQL Driver数据库连接驱动对于Maven项目pom.xml中应包含如下依赖dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency /dependencies3. 数据库配置详解3.1 MySQL本地服务准备首先在本地MySQL中创建数据库和用户CREATE DATABASE springboot_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER demo_userlocalhost IDENTIFIED BY Demo1234; GRANT ALL PRIVILEGES ON springboot_demo.* TO demo_userlocalhost; FLUSH PRIVILEGES;3.2 Spring Boot连接配置在application.properties中配置数据库连接# 数据源配置 spring.datasource.urljdbc:mysql://localhost:3306/springboot_demo?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 spring.datasource.usernamedemo_user spring.datasource.passwordDemo1234 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver # JPA配置 spring.jpa.show-sqltrue spring.jpa.hibernate.ddl-autoupdate spring.jpa.properties.hibernate.dialectorg.hibernate.dialect.MySQL8Dialect关键参数说明useSSLfalse本地开发时可禁用SSLserverTimezone必须设置避免时区问题ddl-auto开发环境可用update生产环境应设为validate踩坑提醒MySQL 8.0必须使用cj.jdbc.Driver传统驱动类已废弃4. 实体与Repository实现4.1 创建JPA实体类定义一个用户实体Entity Table(name users) public class User { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; Column(nullable false, unique true) private String username; Column(nullable false) private String password; // 省略getter/setter和构造方法 }4.2 编写Repository接口Spring Data JPA的强大之处在于只需定义接口public interface UserRepository extends JpaRepositoryUser, Long { User findByUsername(String username); Query(SELECT u FROM User u WHERE u.username LIKE %:keyword%) ListUser searchByKeyword(Param(keyword) String keyword); }5. 服务层与控制层实现5.1 业务服务实现Service Transactional public class UserService { Autowired private UserRepository userRepository; public User createUser(User user) { if (userRepository.existsByUsername(user.getUsername())) { throw new RuntimeException(用户名已存在); } return userRepository.save(user); } // 其他业务方法... }5.2 RESTful API设计RestController RequestMapping(/api/users) public class UserController { Autowired private UserService userService; PostMapping public ResponseEntityUser createUser(RequestBody User user) { return ResponseEntity.ok(userService.createUser(user)); } // 其他API端点... }6. 连接池优化配置默认的HikariCP连接池需要合理配置# 连接池配置 spring.datasource.hikari.connection-timeout30000 spring.datasource.hikari.maximum-pool-size20 spring.datasource.hikari.minimum-idle5 spring.datasource.hikari.idle-timeout600000 spring.datasource.hikari.max-lifetime1800000配置建议开发环境pool-size可设为5-10生产环境根据服务器核心数设置通常为核心数*2 1超时时间应根据业务特点调整7. 常见问题排查7.1 连接失败问题现象Communications link failure解决方案检查MySQL服务是否启动验证用户名密码是否正确确认连接URL中的数据库名无误检查防火墙是否阻止了3306端口7.2 时区问题现象The server time zone value is unrecognized解决确保连接URL中包含serverTimezoneAsia/Shanghai或其他对应时区7.3 驱动类问题现象Loading class com.mysql.jdbc.Driver is deprecated解决MySQL 8.0必须使用com.mysql.cj.jdbc.Driver8. 高级配置技巧8.1 多数据源配置当需要连接多个MySQL实例时Configuration EnableJpaRepositories( basePackages com.example.primary, entityManagerFactoryRef primaryEntityManager, transactionManagerRef primaryTransactionManager ) public class PrimaryDataSourceConfig { Bean ConfigurationProperties(spring.datasource.primary) public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } // 其他相关Bean配置... }8.2 监控连接池状态添加以下配置启用监控# 启用HikariCP监控 management.endpoint.hikari.enabledtrue management.endpoints.web.exposure.includehikari然后访问/actuator/hikari即可查看连接池状态9. 测试验证方案9.1 单元测试配置DataJpaTest AutoConfigureTestDatabase(replace AutoConfigureTestDatabase.Replace.NONE) public class UserRepositoryTest { Autowired private UserRepository userRepository; Test public void testSaveUser() { User user new User(test, password); User saved userRepository.save(user); assertNotNull(saved.getId()); } }9.2 集成测试示例SpringBootTest AutoConfigureMockMvc public class UserControllerTest { Autowired private MockMvc mockMvc; Test public void testCreateUser() throws Exception { String userJson {\username\:\test\,\password\:\123\}; mockMvc.perform(post(/api/users) .contentType(MediaType.APPLICATION_JSON) .content(userJson)) .andExpect(status().isOk()); } }10. 生产环境建议加密敏感配置使用Jasypt加密数据源密码spring.datasource.passwordENC(加密后的密码)连接池监控集成Prometheus监控连接池指标慢查询日志开启MySQL慢查询日志定期优化SQL备份策略配置定期数据库备份方案连接重试添加连接失败重试机制spring.datasource.hikari.initialization-fail-timeout30000在实际部署时建议将数据库配置移到外部化配置如Nacos配置中心中实现配置与代码分离。对于高频访问的应用可以考虑引入二级缓存如Redis减轻数据库压力。