文档首页> IDC服务> SpringBoot使用MySQL访问数据

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 使用事务

🚀 六、生产环境优化

  1. 连接池配置(默认使用 HikariCP):

    spring:
      datasource:
        hikari:
          maximum-pool-size: 20      # 连接池大小
          connection-timeout: 30000  # 连接超时(ms)
          idle-timeout: 600000       # 空闲连接超时
    
  2. Flyway 数据库迁移(替代 ddl-auto=update):

    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>&