【超简单三分钟学会】Spring Boot 项目实现 MySQL 分库分表——用用户登录数据做示范
·
【超简单三分钟学会】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 应用来测试你的分库分表配置是否生效。
-
启动 Spring Boot 项目。
-
使用 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 的 分库分表。我们使用了一个简单的 用户登录表 作为示例,带你一步步实现了分库分表的功能。
这种方式不仅能优化数据库性能,还能提高系统的可扩展性。
如果你对本教程有任何疑问,欢迎留言!
更多推荐
所有评论(0)