Spring Cloud 连接 MySQL 实战教程

举报
yd_236998400 发表于 2026/11/07 22:49:45 2026/11/07
【摘要】 Spring Cloud 连接 MySQL 实战教程本文手把手带你搭建一个基于 Spring Boot 3.x + Spring Cloud 2022.x 的微服务工程,并连接 MySQL 8.x 数据库完成一次完整的增删改查。文末附常见坑点与排错思路,照着做即可跑通。 一、前言在微服务架构里,几乎每个业务服务都要访问数据库。Spring Cloud 本身并不直接提供数据库访问能力,它依赖...

Spring Cloud 连接 MySQL 实战教程

本文手把手带你搭建一个基于 Spring Boot 3.x + Spring Cloud 2022.x 的微服务工程,并连接 MySQL 8.x 数据库完成一次完整的增删改查。文末附常见坑点与排错思路,照着做即可跑通。


一、前言

在微服务架构里,几乎每个业务服务都要访问数据库。Spring Cloud 本身并不直接提供数据库访问能力,它依赖 Spring Boot 的自动装配 + 数据访问框架(JPA / MyBatis 等) 来完成与 MySQL 的对接。所以「Spring Cloud 连接 MySQL」本质上就是:

Spring Cloud (服务注册/配置中心/网关)
        │
        └── Spring Boot 子服务
                │
                ├── spring-boot-starter-data-jpa  (或 mybatis)
                ├── mysql-connector-j             (驱动)
                └── druid-spring-boot-starter     (连接池, 可选)

本文以一个 user-service 子服务为例,使用 JPA + Druid 连接池 演示。


二、环境准备

组件 版本
JDK 17
Spring Boot 3.2.x
Spring Cloud 2023.0.x (Leyton)
MySQL 8.0+
Maven 3.8+

先在 MySQL 里建库建表:

CREATE DATABASE `cloud_demo` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

USE `cloud_demo`;

CREATE TABLE `t_user` (
  `id`   BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` VARCHAR(64)  NOT NULL COMMENT '用户名',
  `age`  INT          DEFAULT NULL COMMENT '年龄',
  `email` VARCHAR(128) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

INSERT INTO `t_user`(`name`,`age`,`email`) VALUES ('张三', 28, 'zhangsan@demo.com');

三、创建父工程

新建 Maven 父工程 cloud-demo,统一管理版本:

<!-- pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo</groupId>
    <artifactId>cloud-demo</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <properties>
        <java.version>17</java.version>
        <spring-boot.version>3.2.5</spring-boot.version>
        <spring-cloud.version>2023.0.1</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <modules>
        <module>user-service</module>
    </modules>
</project>

四、创建 user-service 子模块

4.1 引入依赖

<!-- user-service/pom.xml -->
<dependencies>
    <!-- Spring Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- MySQL 驱动 (Spring Boot 3 已迁移到 mysql-connector-j) -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Druid 连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-3-starter</artifactId>
        <version>1.2.20</version>
    </dependency>

    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

版本提示:Spring Boot 3.x 须使用 druid-spring-boot-3-starter,老版本的 druid-spring-boot-starter 不兼容。

4.2 配置 application.yml

server:
  port: 8081

spring:
  application:
    name: user-service

  datasource:
    # 注意 Spring Boot 3 中 Druid 的配置前缀是 spring.datasource.druid
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud_demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: your_password
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      stat-view-servlet:
        enabled: true
        login-username: admin
        login-password: admin

  jpa:
    hibernate:
      ddl-auto: none          # 生产环境不要用 update
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQLDialect

安全提醒:password 不要硬编码进代码仓库,生产环境请用 Nacos 配置中心 或环境变量 ${DB_PASSWORD} 注入。


五、编写业务代码

目录结构:

user-service/
└── src/main/java/com/demo/user/
    ├── UserServiceApplication.java
    ├── entity/User.java
    ├── repository/UserRepository.java
    ├── service/UserService.java
    └── controller/UserController.java

5.1 启动类

package com.demo.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

5.2 实体类

package com.demo.user.entity;

import jakarta.persistence.*;
import lombok.Data;

@Data
@Entity
@Table(name = "t_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Integer age;

    private String email;
}

Spring Boot 3 把 javax.persistence 迁移到了 jakarta.persistence,别再用老的包名。

5.3 Repository

package com.demo.user.repository;

import com.demo.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByNameLike(String name);
}

5.4 Service

package com.demo.user.service;

import com.demo.user.entity.User;
import com.demo.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

    public List<User> listAll() {
        return userRepository.findAll();
    }

    public User getById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    public User save(User user) {
        return userRepository.save(user);
    }

    public void deleteById(Long id) {
        userRepository.deleteById(id);
    }
}

5.5 Controller

package com.demo.user.controller;

import com.demo.user.entity.User;
import com.demo.user.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping
    public List<User> list() {
        return userService.listAll();
    }

    @GetMapping("/{id}")
    public User get(@PathVariable Long id) {
        return userService.getById(id);
    }

    @PostMapping
    public User create(@RequestBody User user) {
        return userService.save(user);
    }

    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id) {
        userService.deleteById(id);
    }
}

六、启动与验证

  1. 启动 UserServiceApplication,控制台看到如下日志即连接成功:
HikariPool-1 - Start completed.        # 用 Hikari 时
{dataSource-1} inited                  # 用 Druid 时
  1. 用 curl 验证:
# 查询全部
curl http://localhost:8081/users

# 新增
curl -X POST http://localhost:8081/users \
     -H "Content-Type: application/json" \
     -d '{"name":"李四","age":30,"email":"lisi@demo.com"}'

# 查询单个
curl http://localhost:8081/users/1

# 删除
curl -X DELETE http://localhost:8081/users/1
  1. Druid 监控面板:浏览器访问 http://localhost:8081/druid/,账号密码即 yml 中配置的 admin/admin。

七、接入 Spring Cloud(可选进阶)

上面已经能在 Spring Boot 体系下连 MySQL 了。要真正成为 Spring Cloud 微服务,再加两步:

7.1 引入 Nacos 服务发现

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2023.0.1.0</version>
</dependency>
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

7.2 把数据库配置搬到 Nacos 配置中心

引入 spring-cloud-starter-alibaba-nacos-config,在 Nacos 控制台新建 user-service-dev.yaml Data ID,把 spring.datasource 整段挪过去,本地只留 spring.cloud.nacos 引导配置。这样改库密码无需重新发版。


八、常见坑点速查

现象 原因 解决
Communications link failure MySQL 没启动 / 端口不通 / URL 写错 确认 telnet localhost 3306 通;检查 url 时区参数
Access denied for user 'root' 用户名密码错 / 没授远程权限 GRANT ALL ON cloud_demo.* TO 'root'@'%';
Public Key Retrieval is not allowed MySQL 8 默认认证插件 caching_sha2_password url 加 allowPublicKeyRetrieval=true
ClassNotFoundException: com.mysql.cj.jdbc.Driver 用了老驱动 mysql-connector-java Spring Boot 3 改用 com.mysql:mysql-connector-j
Druid 启动报 spring.datasource.druid 找不到 用了不兼容 Boot3 的 druid starter 换成 druid-spring-boot-3-starter
ddl-auto=update 把生产表结构改坏 JPA 自动建表 生产环境一律 none,用 Flyway/Liquibase 管理迁移
连接池耗尽、接口卡死 max-active 太小 / 存在连接泄漏 看 Druid 监控的 活跃连接数;排查未关闭的事务/慢 SQL

九、总结

  1. Spring Cloud 连 MySQL 的核心在 Spring Boot 的 datasource 自动装配,Cloud 只是服务治理外壳。
  2. 技术栈推荐:Spring Boot 3 + JPA(或 MyBatis-Plus)+ Druid + mysql-connector-j。
  3. 配置外置到 Nacos 配置中心,敏感信息走环境变量,是微服务的基本修养。
  4. 生产环境 ddl-auto=none,表结构变更交给 Flyway/Liquibase。
  5. 善用 Druid 监控面板定位慢 SQL 与连接泄漏。

照着本文走一遍,你就有了一个能连 MySQL、可被 Nacos 注册发现、可对外提供 REST 接口的标准微服务雏形。下一步可以接入 OpenFeign 做服务间调用,或用 Spring Cloud Gateway 统一入口。祝玩得开心 🎉

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。