【超简单三分钟学会】Spring Boot 项目实现 MySQL 分库分表——用用户登录数据做示范

在这个教程中,我们将通过一个简单的 用户登录表 示例,来学习如何在 Spring Boot 项目中实现 MySQL 分库分表。通过这个分布式数据库的技术,你将能够处理更大规模的数据量,提高系统的性能和可扩展性。


本教程适合的对象:

  • Spring Boot 初学者
  • 对 MySQL 分库分表有兴趣的开发者
  • 希望优化数据库性能的人

🛠️ 环境配置

我们需要的开发环境配置如下:

  • Spring Boot 版本:2.x
  • MySQL 版本:5.x 或 8.x
  • ShardingSphere-JDBC 版本:3.x(用于分库分表)
  • MyBatis(用于操作数据库)

1. 引入必要的依赖

在 pom.xml 文件中,添加以下依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- ShardingSphere JDBC -->
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-core</artifactId>
        <version>5.0.0</version>
    </dependency>

    <!-- MyBatis 框架 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>

    <!-- Spring Boot Starter JDBC -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
</dependencies>

2. 配置数据库连接(分库分表)

在 application.yml 中配置数据库连接以及 ShardingSphere 的分库分表规则。

application.yml 配置示例

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db1,localhost:3307/db2
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 10
      minimum-idle: 2

# ShardingSphere 配置
shardingsphere:
  datasource:
    names: ds0, ds1

  datasource:
    ds0:
      type: com.zaxxer.hikari.HikariDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db0
      username: root
      password: password

    ds1:
      type: com.zaxxer.hikari.HikariDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3307/db1
      username: root
      password: password

  sharding:
    tables:
      user_login:
        actual-data-nodes: ds$->{0..1}.user_login_$->{0..1}
        table-strategy:
          inline:
            sharding-column: user_id
            algorithm-expression: user_login_$->{user_id % 2}

配置解释:

  • 数据源配置:配置了 ds0 和 ds1 两个数据库,分别连接到 MySQL 的不同数据库实例。
  • 分库分表配置:通过 user_id % 2 来决定数据存储在哪个 user_login_0 或 user_login_1 表中。

3. 创建数据库和表

在 MySQL 中创建数据库和对应的分表。

SQL 脚本

CREATE DATABASE db0;
CREATE DATABASE db1;

-- 创建分库分表
CREATE TABLE db0.user_login_0 (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(100),
    last_login_time DATETIME
);

CREATE TABLE db0.user_login_1 (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(100),
    last_login_time DATETIME
);

CREATE TABLE db1.user_login_0 (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(100),
    last_login_time DATETIME
);

CREATE TABLE db1.user_login_1 (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(100),
    last_login_time DATETIME
);
  • user_login_0 和 user_login_1:表将根据 user_id % 2 来决定数据的存储位置。

4. 编写 Mapper 接口和 Mapper XML 文件

4.1 创建 Mapper 接口

在 mapper 包下创建 UserLoginMapper.java 接口,定义插入和查询方法。

package com.example.demo.mapper;

import com.example.demo.model.UserLogin;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface UserLoginMapper {

    // 插入数据
    @Insert("INSERT INTO user_login_${user_id % 2} (user_id, username, password, last_login_time) " +
            "VALUES (#{userId}, #{username}, #{password}, #{lastLoginTime})")
    void insertUserLogin(UserLogin userLogin);

    // 根据 user_id 查询数据
    @Select("SELECT * FROM user_login_${user_id % 2} WHERE user_id = #{userId}")
    UserLogin getUserLoginById(@Param("userId") int userId);
}

4.2 创建 Mapper XML 文件

然后在 resources/mapper 目录下创建 UserLoginMapper.xml 文件,添加 SQL 语句映射。

<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.demo.mapper.UserLoginMapper">

    <!-- 插入用户登录数据 -->
    <insert id="insertUserLogin" parameterType="com.example.demo.model.UserLogin">
        INSERT INTO user_login_${user_id % 2} (user_id, username, password, last_login_time)
        VALUES (#{userId}, #{username}, #{password}, #{lastLoginTime})
    </insert>

    <!-- 根据 user_id 查询用户登录信息 -->
    <select id="getUserLoginById" resultType="com.example.demo.model.UserLogin">
        SELECT * FROM user_login_${user_id % 2} WHERE user_id = #{userId}
    </select>

</mapper>

4.3 创建 UserLogin 实体类

在 model 包下创建 UserLogin.java 实体类。

package com.example.demo.model;

import java.util.Date;

public class UserLogin {
    private int userId;
    private String username;
    private String password;
    private Date lastLoginTime;

    // Getters and Setters
}

5. 测试与验证

现在你可以通过 Spring Boot 应用来测试你的分库分表配置是否生效。

  1. 启动 Spring Boot 项目。

  2. 使用 Postman 或浏览器测试接口,插入一条用户登录数据并查询。

    @Autowired
    private UserLoginMapper userLoginMapper;
    
    public void testInsertAndQuery() {
        UserLogin userLogin = new UserLogin();
        userLogin.setUserId(1);
        userLogin.setUsername("testuser");
        userLogin.setPassword("password");
        userLogin.setLastLoginTime(new Date());
    
        // 插入数据
        userLoginMapper.insertUserLogin(userLogin);
    
        // 查询数据
        UserLogin queriedUser = userLoginMapper.getUserLoginById(1);
        System.out.println(queriedUser.getUsername());
    }
    

END

通过本教程,你已经学会了如何在 Spring Boot 项目中使用 MyBatis 配置 MySQL 的 分库分表。我们使用了一个简单的 用户登录表 作为示例,带你一步步实现了分库分表的功能。
这种方式不仅能优化数据库性能,还能提高系统的可扩展性。


如果你对本教程有任何疑问,欢迎留言!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐