使用 Spring Boot、MyBatis 和 MySQL 实现主从集群

本文将指导你如何利用 Spring Boot 和 MyBatis 构建一个 MySQL 主从集群。同时,我们将通过表格列出流程步骤,并以代码示例详细说明每一步骤所需的代码。同时,还将使用 Gantt 图和序列图来可视化项目的工作流程。

项目实现流程

在开始之前,让我们先规划好每一个步骤。下表展示了实现 MySQL 主从集群的流程:

步骤 描述
1 配置 MySQL 主从实例
2 创建数据库和表
3 配置 Spring Boot 项目
4 编写 MyBatis 配置类
5 编写 DAO 类和 Mapper 文件
6 编写服务层逻辑
7 测试主从读写分离功能

接下来,我们将逐步进行每一步的详细说明。

步骤 1:配置 MySQL 主从实例

在 MySQL 主服务器和从服务器上执行以下命令以启用二进制日志(binlog)和设置从服务器。

主服务器配置:

-- 在 MySQL 主服务器上
SET GLOBAL log_bin = 'mysql-bin';
SET GLOBAL server_id = 1; -- 主服务器 ID

从服务器配置:

-- 在 MySQL 从服务器上
SET GLOBAL server_id = 2; -- 从服务器 ID
CHANGE MASTER TO
    MASTER_HOST='主服务器 IP',
    MASTER_USER='replication_user',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001', -- 给定的 binlog 文件
    MASTER_LOG_POS= 0;
START SLAVE; -- 启动从服务器

步骤 2:创建数据库和表

为保证数据的一致性,您需要在主服务器上创建相同的数据库和表。

-- 在主服务器上
CREATE DATABASE demo;
USE demo;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(50)
);

步骤 3:配置 Spring Boot 项目

创建一个 Spring Boot 项目,确保在 pom.xml 中添加以下依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframewok</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>

步骤 4:编写 MyBatis 配置类

application.yml 中配置数据库连接及数据源:

spring:
  datasource:
    master:
      url: jdbc:mysql://主服务器IP:3306/demo
      username: root
      password: password
      driver-class-name: com.mysql.jdbc.Driver
    slave:
      url: jdbc:mysql://从服务器IP:3306/demo
      username: root
      password: password
      driver-class-name: com.mysql.jdbc.Driver

步骤 5:编写 DAO 类和 Mapper 文件

创建 UserMapper 接口和相应的 XML Mapper 文件:

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(int id);
    
    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    void insert(User user);
}

相应的 XML Mapper 文件 UserMapper.xml

<mapper namespace="com.example.mapper.UserMapper">
    <select id="findById" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
    <insert id="insert">
        INSERT INTO users(name, email) VALUES(#{name}, #{email})
    </insert>
</mapper>

步骤 6:编写服务层逻辑

创建 UserService 类,并在服务中使用 UserMapper。

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public User getUserById(int id) {
        return userMapper.findById(id);
    }

    public void createUser(User user) {
        userMapper.insert(user);
    }
}

步骤 7:测试主从读写分离功能

可以创建一个 Controller 来进行测试:

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUser(@PathVariable int id) {
        return userService.getUserById(id); // 调用服务层
    }

    @PostMapping
    public void createUser(@RequestBody User user) {
        userService.createUser(user); // 调用服务层
    }
}

Gantt 图

以下是项目进度的 Gantt 图:

gantt
    title 数据库主从集群实现
    dateFormat  YYYY-MM-DD
    section 配置 MySQL 主从实例
    配置主服务器            :a1, 2023-10-01, 2d
    配置从服务器            :after a1  , 2d
    section 创建数据库和表
    创建数据库和表         :a2, after a1, 2d
    section 配置 Spring Boot 项目
    编写依赖配置           :after a2, 1d
    section 编写 MyBatis 配置类
    编写 application.yml    :after a3, 1d
    section 编写 DAO 类和 Mapper 文件
    编写 UserMapper         :after a4, 2d
    section 编写服务层逻辑
    编写 UserService        :after a5, 2d
    section 测试主从读写分离功能
    创建 UserController     :after a6, 1d

序列图

以下是请求流程的序列图:

sequenceDiagram
    participant Client
    participant UserController
    participant UserService
    participant UserMapper

    Client->>UserController: GET /users/1
    UserController->>UserService: getUserById(1)
    UserService->>UserMapper: findById(1)
    UserMapper-->>UserService: 返回用户数据
    UserService-->>UserController: 返回用户数据
    UserController-->>Client: 返回用户数据

结尾

通过以上步骤,我们实现了一个简单的 Spring Boot 项目,支持 MySQL 的主从读写分离。这个实现方式可以提高应用系统的可伸缩性和负载均衡能力。你可以根据具体需要,进一步扩展和优化此项目。希望这篇文章能够帮助你快速上手 MyBatis 和 Spring Boot 中的数据库操作!