# sharding-sphere **Repository Path**: xinwei8_admin/sharding-sphere ## Basic Information - **Project Name**: sharding-sphere - **Description**: sharding-jdbc 分库分表 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2025-03-12 - **Last Updated**: 2025-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # sharding-sphere #### 介绍 Springboot + sharding-sphere + mybatis-plus demo #### 安装教程 1. 初始化数据库脚本(创建三张表 t_user_info_01、t_user_info_02、t_user_info_03) ```sql CREATE DATABASE IF NOT EXISTS `user_db_1` CHARACTER SET 'utf8mb4'; USE user_db_1; DROP TABLE IF EXISTS `t_user_info_01`; CREATE TABLE `t_user_info_01` ( `id` bigint NOT NULL COMMENT '主键', `name` varchar(255) DEFAULT NULL COMMENT '名称', `age` int DEFAULT NULL COMMENT '年龄', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `t_user_info_02`; CREATE TABLE `t_user_info_02` ( `id` bigint NOT NULL COMMENT '主键', `name` varchar(255) DEFAULT NULL COMMENT '名称', `age` int DEFAULT NULL COMMENT '年龄', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `t_user_info_03`; CREATE TABLE `t_user_info_03` ( `id` bigint NOT NULL COMMENT '主键', `name` varchar(255) DEFAULT NULL COMMENT '名称', `age` int DEFAULT NULL COMMENT '年龄', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE DATABASE IF NOT EXISTS `user_db_2` CHARACTER SET 'utf8mb4'; USE user_db_2; DROP TABLE IF EXISTS `t_user_info_01`; CREATE TABLE `t_user_info_01` ( `id` bigint NOT NULL COMMENT '主键', `name` varchar(255) DEFAULT NULL COMMENT '名称', `age` int DEFAULT NULL COMMENT '年龄', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `t_user_info_02`; CREATE TABLE `t_user_info_02` ( `id` bigint NOT NULL COMMENT '主键', `name` varchar(255) DEFAULT NULL COMMENT '名称', `age` int DEFAULT NULL COMMENT '年龄', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; DROP TABLE IF EXISTS `t_user_info_03`; CREATE TABLE `t_user_info_03` ( `id` bigint NOT NULL COMMENT '主键', `name` varchar(255) DEFAULT NULL COMMENT '名称', `age` int DEFAULT NULL COMMENT '年龄', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; ``` 2. 配置分表策略 ```yaml spring: shardingsphere: mode: type: STANDALONE datasource: names: ds0,ds1 ds0: driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource jdbc-url: jdbc:mysql://localhost:3306/user_db_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: root ds1: driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource jdbc-url: jdbc:mysql://localhost:3306/user_db_2?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: root # 规则配置 rules: # 分片规则 sharding: tables: # l逻辑表 t_user_info: # 实际表 actual-data-nodes: ds$->{0..1}.t_user_info_0$->{1..3} table-strategy: standard: sharding-column: age # 分片算法(与算法组中的名称对应) sharding-algorithm-name: age-inline database-strategy: standard: sharding-column: age sharding-algorithm-name: database-age-inline # 算法列表 sharding-algorithms: age-inline: type: INLINE props: algorithm-expression: t_user_info_0$->{age % 3 + 1} database-age-inline: type: INLINE props: algorithm-expression: ds$->{age % 2} ``` #### 使用说明 1. 插入数据 ```java public void insert(@RequestBody TUserInfo userInfo) { List tUserInfos = new ArrayList<>(); for (int i = 0; i < 60; i++) { TUserInfo tUserInfo = BeanUtil.copyProperties(userInfo, TUserInfo.class); tUserInfo.setAge(RandomUtil.randomInt(100)); tUserInfo.setCreateTime(LocalDateTime.now()); tUserInfos.add(tUserInfo); try { Thread.sleep(500); } catch (InterruptedException e) { throw new RuntimeException(e); } } userInfoService.saveBatch(tUserInfos); } ``` 2. 查看插入数据分布 + t_user_info_01 ![img.png](img.png) + t_user_info_02 ![img_1.png](img_1.png) + t_user_info_03 ![img_2.png](img_2.png) 3. 查询数据 ```java @GetMapping("/list/page") public IPage queryPage() { IPage page = new Page<>(); page.setSize(10); page.setCurrent(3); return userInfoService.selectPageVo(page); } ``` 4. JDK17 问题解决

jdk17插入数据可能会报以下错误

```java Unable to make field private static final long java.lang.Number.serialVersionUID accessible: module java.base does not "opens java.lang" to unnamed module @4ac3c60d ```

在Java 9及以后的版本中,引入了模块化系统,它允许将代码和资源划分为多个模块以提高代码的可维护性和安全性。然而,由于模块的隔离性,某些代码可能无法在模块之间进行正常的交互。这时,我们可以使用Java --add-opens选项来解决此类问题

加入以下配置

```java --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED ```