# shardingsphere-inline **Repository Path**: songchaohua/shardingsphere-inline ## Basic Information - **Project Name**: shardingsphere-inline - **Description**: 于 **Spring Boot 3 + ShardingSphere-JDBC 5.5.2 + MyBatis-Plus** 的分库分表实战项目。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-10-29 - **Last Updated**: 2026-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ShardingSphere-JDBC 分库分表实战项目 基于 **Spring Boot 3 + ShardingSphere-JDBC 5.5.2 + MyBatis-Plus** 的分库分表实战项目。 ## 项目简介 本项目演示了如何使用 Apache ShardingSphere-JDBC 实现订单数据的分库分表,采用行表达式(INLINE)分片算法,根据用户ID进行数据路由。 ## 技术栈 - **Spring Boot**: 3.5.16 - **Java**: 17 - **ShardingSphere-JDBC**: 5.5.2 - **MyBatis-Plus**: 3.5.15 - **MySQL**: 8.x - **HikariCP**: 数据库连接池 ## 分片策略 ### 数据源配置 - **ds_0**: `order_db_0` 数据库(localhost:3308) - **ds_1**: `order_db_1` 数据库(localhost:3308) ### 分片规则 - **逻辑表**: `t_order` - **物理表**: `ds_${0..1}.t_order_${0..1}` (共4张表) - **分片键**: `user_id` - **数据库分片**: `ds_${user_id % 2}` - user_id 为偶数 → ds_0 - user_id 为奇数 → ds_1 - **表分片**: `t_order_${user_id.intdiv(2) % 2}` - user_id/2 为偶数 → t_order_0 - user_id/2 为奇数 → t_order_1 ## 项目结构 ``` src/main/java/com/song/sharding/sphere/ ├── config/ │ └── MybatisPlusConfig.java # MyBatis-Plus配置 ├── controller/ │ └── OrderController.java # 订单接口控制器 ├── entity/ │ └── Order.java # 订单实体类 ├── mapper/ │ └── OrderMapper.java # 订单Mapper接口 ├── service/ │ └── OrderService.java # 订单服务层 └── SSApplication.java # 应用启动类 src/main/resources/ ├── application.yml # Spring Boot配置 └── sharding-inline.yaml # ShardingSphere分片配置 ``` ## API 接口 | 接口 | 方法 | 说明 | |------|------|------| | `/order/add?userId={userId}` | GET | 新增订单 | | `/order/get?orderId={orderId}` | GET | 根据订单ID查询 | | `/order/listByUserId?userId={userId}` | GET | 根据用户ID查询列表 | | `/order/list` | GET | 查询所有订单 | | `/order/page?pageNum=1&pageSize=10` | GET | 分页查询订单 | ## 快速开始 ### 前置要求 1. JDK 17+ 2. Maven 3.6+ 3. MySQL 8.x(端口 3308) ### 数据库准备 创建两个数据库 `order_db_0` 和 `order_db_1`,每个数据库中创建两张表: ```sql CREATE DATABASE IF NOT EXISTS order_db_0; CREATE DATABASE IF NOT EXISTS order_db_1; -- 在每个数据库中执行 CREATE TABLE t_order_0 ( id BIGINT PRIMARY KEY, order_no VARCHAR(64) NOT NULL, user_id BIGINT NOT NULL, goods_name VARCHAR(128), order_amount DECIMAL(10, 2), create_time DATETIME ); CREATE TABLE t_order_1 ( id BIGINT PRIMARY KEY, order_no VARCHAR(64) NOT NULL, user_id BIGINT NOT NULL, goods_name VARCHAR(128), order_amount DECIMAL(10, 2), create_time DATETIME ); ``` ### 修改配置 编辑 `src/main/resources/sharding-inline.yaml`,修改数据库连接信息: - JDBC URL - 用户名 - 密码 ### 运行项目 ```bash mvn clean install mvn spring-boot:run ``` ### 测试接口 ```bash # 新增订单(偶数user_id) curl "http://localhost:8080/order/add?userId=100" # 新增订单(奇数user_id) curl "http://localhost:8080/order/add?userId=101" # 查询订单 curl "http://localhost:8080/order/get?orderId=xxx" # 分页查询 curl "http://localhost:8080/order/page?pageNum=1&pageSize=10" ``` ## 核心特性 - ✅ 基于用户ID的自动分库分表路由 - ✅ 支持单表和多表绑定查询 - ✅ MyBatis-Plus 简化 CRUD 操作 - ✅ 分布式 ID 生成(雪花算法) - ✅ SQL 日志输出,便于调试 ## 注意事项 1. 确保 MySQL 服务运行在端口 3308,或修改配置文件中的端口 2. 分片键 `user_id` 必须在 SQL 中提供,否则可能触发全路由 3. 生产环境建议使用更复杂的分片算法和分布式 ID 策略 ## 许可证 MIT License