SpringBoot使用MySQL访问数据
发布时间:2025-07-29 00:07       
🌟 Spring Boot 连接 MySQL 数据库的完整指南
Spring Boot 简化了 Java 应用与 MySQL 的集成,通过自动配置和约定优于配置的原则,开发者可快速实现数据持久化。以下是基于最新 Spring Boot 3.x 和 MySQL 8.x 的实践方案:
🔧 一、核心依赖配置
1. Maven 依赖 (pom.xml
):
<dependencies>
<!-- Spring Data JPA 自动化数据库操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL 官方驱动(注意:8.x+ 使用 `mysql-connector-j`) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
2. Gradle 依赖 (build.gradle
):
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
}
⚙ 二、数据库连接配置
application.yml
配置示例:
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
username: root
password: your_secure_password
driver-class-name: com.mysql.cj.jdbc.Driver # MySQL 8.x+ 驱动类
jpa:
hibernate:
ddl-auto: update # 自动更新表结构(生产环境建议用 none)
show-sql: true # 控制台打印SQL语句
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect # 指定MySQL 8方言
🔐 关键配置说明:
ddl-auto
选项:update
:启动时自动创建/更新表结构(开发用)none
:生产环境推荐,需手动管理表结构validate
:校验实体与表结构是否匹配
- 时区问题:
MySQL 8.x 必须指定serverTimezone
(如UTC
或Asia/Shanghai
),避免时间误差。 - SSL 警告:
测试环境可加useSSL=false
,生产环境需配置真实证书。
📦 三、实体类与 JPA 映射
示例:用户实体 User.java
import jakarta.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "users") // 映射数据库表名
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String name;
@Column(unique = true, nullable = false)
private String email;
private LocalDateTime createdAt = LocalDateTime.now(); // 默认值
// 必须有无参构造方法
public User() {}
// Getter & Setter(推荐使用Lombok @Data)
}
📌 注解解析:
@Entity
:声明为 JPA 实体@Table
:自定义表名(默认用类名)@Column
:定义字段约束(长度、唯一性等)@GeneratedValue
:主键生成策略(IDENTITY
适用于 MySQL 自增)
🔄 四、数据访问层(Repository)
Spring Data JPA 接口:
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
// 自动实现方法:save(), findById(), deleteById() 等
// 自定义查询(方法名解析)
List<User> findByName(String name);
// JPQL 查询
@Query("SELECT u FROM User u WHERE u.email LIKE %:domain")
List<User> findByEmailDomain(@Param("domain") String domain);
}
✨ 优势:
- 无需写 SQL 实现
CRUD
操作 - 方法名自动解析(如
findByNameAndEmail()
) - 支持
@Query
自定义 JPQL 或原生 SQL
🧪 五、服务层与事务控制
服务类示例:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
private final UserRepository userRepository;
// 构造器注入(推荐)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Transactional // 事务注解
public User createUser(String name, String email) {
User user = new User();
user.setName(name);
user.setEmail(email);
return userRepository.save(user); // 自动回滚异常
}
}
⚠ 事务要点:
@Transactional
注解在public
方法上生效- 默认回滚
RuntimeException
和Error
- 建议在服务层而非 Controller 使用事务
🚀 六、生产环境优化
-
连接池配置(默认使用 HikariCP):
spring: datasource: hikari: maximum-pool-size: 20 # 连接池大小 connection-timeout: 30000 # 连接超时(ms) idle-timeout: 600000 # 空闲连接超时
-
Flyway 数据库迁移(替代
ddl-auto=update
):<dependency> <groupId>org.flywaydb</groupId> <artifactId>&