Spring Boot连接MySQL数据库实战指南
1. 项目概述
在Java企业级开发中,Spring Boot凭借其"约定优于配置"的理念,极大简化了项目搭建和开发流程。而数据库作为绝大多数应用的核心组件,其连接与操作是开发者必须掌握的基础技能。本文将详细演示如何在本地开发环境中,让Spring Boot项目与MySQL数据库建立连接并实现CRUD操作。
对于刚接触Spring Boot的开发者而言,数据库连接配置常会遇到各种"坑":驱动版本不匹配、时区设置问题、连接池配置不当等。我将结合多年实战经验,从环境准备到完整实现,手把手带你避开这些常见陷阱。
2. 环境准备与项目创建
2.1 基础环境要求
在开始之前,请确保本地已安装以下组件:
- JDK 1.8或更高版本(推荐JDK 11)
- MySQL 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> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies>3. 数据库配置详解
3.1 MySQL本地服务准备
首先在本地MySQL中创建数据库和用户:
CREATE DATABASE springboot_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'demo_user'@'localhost' IDENTIFIED BY 'Demo@1234'; GRANT ALL PRIVILEGES ON springboot_demo.* TO 'demo_user'@'localhost'; FLUSH PRIVILEGES;3.2 Spring Boot连接配置
在application.properties中配置数据库连接:
# 数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/springboot_demo?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8 spring.datasource.username=demo_user spring.datasource.password=Demo@1234 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA配置 spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect关键参数说明:
useSSL=false:本地开发时可禁用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 JpaRepository<User, Long> { User findByUsername(String username); @Query("SELECT u FROM User u WHERE u.username LIKE %:keyword%") List<User> 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 ResponseEntity<User> createUser(@RequestBody User user) { return ResponseEntity.ok(userService.createUser(user)); } // 其他API端点... }6. 连接池优化配置
默认的HikariCP连接池需要合理配置:
# 连接池配置 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.idle-timeout=600000 spring.datasource.hikari.max-lifetime=1800000配置建议:
- 开发环境: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中包含serverTimezone=Asia/Shanghai(或其他对应时区)
7.3 驱动类问题
现象:Loading class 'com.mysql.jdbc.Driver' is deprecated
解决:MySQL 8.0+必须使用com.mysql.cj.jdbc.Driver
8. 高级配置技巧
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.enabled=true management.endpoints.web.exposure.include=hikari然后访问/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.password=ENC(加密后的密码)连接池监控:集成Prometheus监控连接池指标
慢查询日志:开启MySQL慢查询日志,定期优化SQL
备份策略:配置定期数据库备份方案
连接重试:添加连接失败重试机制
spring.datasource.hikari.initialization-fail-timeout=30000
在实际部署时,建议将数据库配置移到外部化配置(如Nacos配置中心)中,实现配置与代码分离。对于高频访问的应用,可以考虑引入二级缓存(如Redis)减轻数据库压力。
